实验11 链表 程序2 删除结点
输入若干个正整数(输入-1为结束标志)建立一个单向链表,再输入一个整数m,删除链表中值为m的所有结点。
#include <stdio.h> #include <stdlib.h> struct ListNode { int data; struct ListNode *next; }; struct ListNode *Create_list(); struct ListNode *Delete_m(struct ListNode *head, int m ); void print_list( struct ListNode *head) { struct ListNode *p =head; while (p) { printf("%d ",p->data); p=p->next; } printf("\n"); } int main(void) { int m; printf("连续输入多个整数(-1表示结束):"); struct ListNode *head =Create_list(); printf("\n链表的数据: "); print_list(head); printf("输入要删除的整数:"); scanf("%d", &m); head= Delete_m(head, m); print_list(head); return 0; } struct ListNode *Create_list() { struct ListNode *head,*p1,*p2; int m; int size=sizeof(struct ListNode); head=NULL; //这是没有头节点的链表 //先调用scanf(),再调用malloc()创建了新节点 while(1) { scanf("%d", &m); if(m == -1) //输入的是-1,退出循环 { break; } p1=(struct ListNode*)malloc(size); p1->data=m; p1->next=NULL; if(head == NULL) { head=p1; } else { p2->next=p1; //新节点插入链表的尾部 } p2=p1; } return head; } struct ListNode *Delete_m( struct ListNode *head, int m ) { struct ListNode *ptr, *ptr1; while( head!=NULL && (head->data == m) ) { ptr1=head; head=head->next; free(ptr1); } if( head==NULL ) return NULL; ptr=head; ptr1=head->next; while(ptr1!=NULL) { if(ptr1->data==m) { ptr->next=ptr1->next; free(ptr1); } else ptr=ptr1; ptr1=ptr->next; } return head; }
// 测试结果: // 连续输入多个整数(-1表示结束):10 10 20 30 10 40 10 10 -1 // 链表的数据: 10 10 20 30 10 40 10 10 // 输入要删除的整数:10 // 20 30 40