题目描述
KiKi学习了结构体和指针,他了解了结构体类型可以定义包含多个不同类型成员,而指针本质是内存地址,是引用数据的另外一种方式。现在他想将多个输入的数据通过结构体和指针的方式连接在一起,形成一个单向链表,即:每个结点是结构体类型,包括整型数据成员(data)和结构体指针类型成员(next),每个结点的指针部分指向下一个输入的结点。具体建立过程如下:先输入n个整数,按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除。输出删除后的单链表信息。
输入描述:
包括三行:
第一行输入数据个数n (3≤n≤100);
第二行依次输入n个整数,用空格分隔;
第三行输入欲删除数据m。
输出描述:
包括两行:
第一行输出完成删除后的单链表长度;
第二行依次输出完成删除后的单链表数据。
1 #include <stdio.h> 2 #include <stdlib.h> 3 struct ListNode 4 { 5 int val; 6 struct ListNode *next; 7 }*newlist; 8 int main() 9 { 10 int n; 11 scanf("%d",&n); 12 int i,x; 13 struct ListNode *nl=(struct ListNode*)malloc(sizeof(struct ListNode)); 14 nl->next=NULL; 15 struct ListNode *q=nl,*tmp,*p; 16 for(i=0;i<n;i++){ 17 scanf("%d",&x); 18 tmp=(struct ListNode*)malloc(sizeof(struct ListNode)); 19 tmp->next=NULL; 20 tmp->val=x; 21 q->next=tmp; 22 q=tmp; 23 } 24 int m; 25 scanf("%d",&m); 26 q=nl->next; 27 struct ListNode *newl=(struct ListNode*)malloc(sizeof(struct ListNode)); 28 newl->next=NULL; 29 int cnt=0; 30 p=newl; 31 while(q){ 32 if(q->val!=m){ 33 tmp=(struct ListNode*)malloc(sizeof(struct ListNode)); 34 tmp->next=NULL; 35 tmp->val=q->val; 36 p->next=tmp; 37 p=tmp; 38 cnt++; 39 } 40 q=q->next; 41 } 42 printf("%d ",cnt); 43 q=newl->next; 44 while(q){ 45 cnt--; 46 if(cnt==0) printf("%d ",q->val); 47 else printf("%d ",q->val); 48 q=q->next; 49 } 50 }