6-2 单链表结点删除(20 分)_单链表的删除节点的两种方式——还是双指针和链表覆盖好用

来源:互联网 发布:免费淘宝模板代码 编辑:程序博客网 时间:2024/05/24 04:26

6-2 单链表结点删除(20 分)
本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中所有存储了某给定值的结点删除。链表结点定义如下:

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

#include <stdio.h>#include <stdlib.h>struct ListNode {    int data;    struct ListNode *next;};struct ListNode *readlist(){    struct ListNode *head, *p, *tail;    head = (struct ListNode*)malloc(sizeof(struct ListNode));    head->next = NULL;    p = head;    while (1)    {        tail = (struct ListNode*)malloc(sizeof(struct ListNode));        scanf("%d", &tail->data);        if (tail->data == -1) break;        p->next = tail;        p = tail;    }    p->next = NULL;    return head;}struct ListNode *deletem(struct ListNode *L, int m){    //开双指针,还是不是很清楚下面的的代码为什么会抛出异常    //解决异常,其实去掉的是下下一个,还是双指针爽,可以直接覆盖头尾的情况;    //其实仔细想一下,一定要有一个指针来记录前驱就一定要两个指针,一个访问,一个记录前一个    struct ListNode *head=L, *tail=L->next, *p=L;    while (tail)    {        if (tail->data == m)        {            head->next = tail->next;            free(tail);            tail = head->next;            continue;        }        head = head->next;        tail = tail->next;    }    return p->next;    /*struct ListNode *p=NULL, *head = L;    L = L->next;    while (L)    {        if (L->data == m)        {            p = L->next;            L->next = p->next;            p->next=NULL;            free(p);         }        L = L->next;    }    return head->next;    */}/*创建新链表覆盖法struct ListNode *deletem(struct ListNode *L, int m){    L = L->next;    struct ListNode *p,*head,*tail;    head = (struct ListNode*)malloc(sizeof(struct ListNode));    head->next = NULL;    p = head;    while (L)    {        if (L->data != m)        {            tail = (struct ListNode*)malloc(sizeof(struct ListNode));            tail->data = L->data;            p->next = tail;            p = tail;        }        L = L->next;    }    p->next = NULL;    return head->next;}*/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;}
阅读全文
0 0
原创粉丝点击