- 奇数值结点链表:输入若干个正整数(输入-1为结束标志)建立一个单向链表,头指针为L,将链表L中奇数值的结点重新组成一个新的链表NEW,并输出新建链表的信息。试编写相应程序。
第一种方案:
#include<stdio.h>
#include<stdlib.h>
struct num_node {
int x;
struct num_node *next;
};
int main() {
int a;
struct num_node *L = NULL, *NEW = NULL, *p = NULL, *s = NULL, *q = NULL;
// 输入链表
scanf("%d", &a);
while(a != -1) {
p = (struct num_node*)malloc(sizeof(struct num_node));
p->x = a;
p->next = NULL;
if(L == NULL) {
L = p;
s = L;
} else {
s->next = p;
s = p;
}
scanf("%d", &a);
}
// 从原链表中提取奇数节点,组成新链表
p = L;
q = NULL; // q 用于追踪新链表的尾节点
while(p != NULL) {
if(p->x % 2 != 0) { // 如果是奇数
s = (struct num_node*)malloc(sizeof(struct num_node));
s->x = p->x;
s->next = NULL;
if(NEW == NULL) {
NEW = s;
q = NEW;
} else {
q->next = s;
q = s;
}
}
p = p->next; // 关键:移动原链表指针
}
// 输出新链表(只含奇数)
q = NEW;
while(q != NULL) {
printf("%d ", q->x);
q = q->next;
}
printf("\n");
// 释放内存(可选,但好习惯)
// 释放原链表
p = L;
while(p != NULL) {
struct num_node* temp = p;
p = p->next;
free(temp);
}
// 释放新链表
q = NEW;
while(q != NULL) {
struct num_node* temp = q;
q = q->next;
free(temp);
}
return 0;
}
输入样例:1 2 3 4 5 6 7 8 9 -1
输出结果:1 3 5 7 9
第二种方案:
#include<stdio.h>
#include<stdlib.h>
struct num_node{
int x;
struct num_node *next;
};
struct num_node *createList(struct num_node *head);
struct num_node *Insert_node(struct num_node *head,struct num_node *p);
struct num_node *Select_node(struct num_node *head);
void print(struct num_node *head);
void free_node(struct num_node *head);
int main()
{
struct num_node *L=createList(NULL),*NEW=Select_node(L);
print(NEW);
free_node(L);
free_node(NEW);
return 0;
}
//创建链表
struct num_node *createList(struct num_node *head){
int a;
struct num_node *p=NULL;
scanf("%d",&a);
while(a!=-1){
p=(struct num_node*)malloc(sizeof(struct num_node));
p->x=a;
p->next=NULL;
head=Insert_node(head,p);
scanf("%d",&a);
}
return head;
}
//插入结点
struct num_node *Insert_node(struct num_node *head,struct num_node *p){
struct num_node *s=head;
if(head==NULL){
head=p;
s=head;
}
else{
while(s->next!=NULL){
s=s->next;
}
s->next=p;
s=p;
}
return head;
}
//摘取奇数结点形成新的链表
struct num_node *Select_node(struct num_node *head){
struct num_node *NEW=NULL,*p=head,*s=NULL,*q=NULL;
while(p!=NULL){
if(p->x%2!=0){
s=(struct num_node *)malloc(sizeof(struct num_node));
s->x=p->x;
s->next=NULL;
if(NEW==NULL){
NEW=s;
q=NEW;
}
else{
q->next=s;
q=s;
}
}
p=p->next;
}
return NEW;
}
//打印链表
void print(struct num_node *head){
struct num_node *q=head;
while(q!=NULL){
printf("%d ",q->x);
q=q->next;
}
}
//释放结点
void free_node(struct num_node *head){
struct num_node *q=head,*temp=NULL;
while(q!=NULL){
temp=q;
q=q->next;
free(temp);
}
}
输入样例:1 2 3 4 5 6 7 8 9 11 13 -1
输出结果:1 3 5 7 9 11 13