本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中所有存储了某给定值的结点删除。链表结点定义如下:
struct ListNode { int data; ListNode *next; };
struct ListNode *readlist(); struct ListNode *deletem( struct ListNode *L, int m );
函数readlist
从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。
函数deletem
将单链表L
中所有存储了m
的结点删除。返回指向结果链表头结点的指针。
#include <stdio.h> #include <stdlib.h> struct ListNode { int data; struct ListNode *next; }; struct ListNode *readlist(); struct ListNode *deletem( struct ListNode *L, int m ); void printlist( struct ListNode *L ) { struct ListNode *p = L; while (p) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { int m; struct ListNode *L = readlist(); scanf("%d", &m); L = deletem(L, m); printlist(L); return 0; } /* 你的代码将被嵌在这里 */
10 11 10 12 10 -1 10
11 12
参考答案:
int size = sizeof(struct ListNode); struct ListNode *readlist() { struct ListNode *p, *head = NULL, *tail = NULL; int data; scanf("%d", &data); while (data != -1) { p = (struct ListNode *)malloc(size); p->data = data; p->next = NULL; if (head == NULL) tail = head = p; //此题也可以不给tail赋值 else tail->next = p; tail = p; scanf("%d", &data); } return head; } struct ListNode *deletem(struct ListNode *L, int m) { struct ListNode *ptr1, *ptr2; // 删除的节点为表头节点 while (L && L->data == m) { ptr2 = L; L = L->next; free(ptr2); } // 空链表 if (L == NULL) return NULL; // 删除的节点不是表头节点 ptr1 = L; ptr2 = ptr1->next; while (ptr2) { if (ptr2->data == m) { ptr1->next = ptr2->next; free(ptr2); } else ptr1 = ptr2; ptr2 = ptr1->next; } return L; }