习题11-8 单链表结点删除 (20 分)
本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中所有存储了某给定值的结点删除。链表结点定义如下:
struct ListNode { int data; ListNode *next; };
函数接口定义:
struct ListNode *readlist(); struct ListNode *deletem( struct ListNode *L, int m );
函数 readlist 从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−时表示输入结束,函数应返回指向单链表头结点的指针。
函数 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
提交:
#include <stdio.h> #include <stdlib.h> // struct ListNode { // int data; // struct ListNode *next; // }; struct ListNode *readlist(){ struct ListNode *head,*tail,*temp; temp = tail = (struct ListNode*)malloc(sizeof(struct ListNode)); head = NULL; int cnt = 0;//节点个数 scanf("%d",&temp->data); while(temp->data != -1){ cnt++; if (cnt == 1) head = temp; else tail->next = temp; tail = temp; temp = (struct ListNode*)malloc(sizeof(struct ListNode)); scanf("%d",&temp->data); } tail->next = NULL; return head; }; struct ListNode *deletem( struct ListNode *L, int m ){ struct ListNode *tail,*temp; for (temp=L,tail=NULL;temp;) { if (temp->data == m) {//判断该节点是否需要删除 if (tail){//tail存储的是上个节点,如果存在tail,即该节点不是L的头节点 tail->next = temp->next; free(temp); temp = tail->next; } else {//删除该节点 L = L->next;//tail节点不存在,该节点为L的头节点 temp = L; } } else {//该节点不需要删除 tail = temp; temp = temp->next; } } return L; }; // 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; } /* 你的代码将被嵌在这里 */