链表删除节点问题

作者:超级管理员 更新时间:2017-09-12 12:58:09 来源:未知 点击:15642
delete函数不能删除第一个节点(fuck_1),出现段错误;请教各位大佬,错误在哪儿。#include #include #include 
delete函数不能删除第一个节点(fuck_1),出现段错误;请教各位大佬,错误在哪儿。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct person
{
    char *labe;
    struct person *pre;
    struct person *next;
};

struct jack
{
    struct person p;
    char name[10];
    char food[10];
};

struct fuck
{
    struct person p;
    char name[10];
    char food[10];
};

void print_jack(struct person *curr)
{
    struct jack *t = (struct jack *)curr;

    printf("%s eat %s\n",t->name,t->food);
}

void print_fuck(struct person *curr)
{
    struct fuck *t = (struct fuck *)curr;

    printf("%s eat %s\n",t->name,t->food);
}

void head_list(struct person **head, struct person *n)
{
    n->pre = NULL;
    n->next = *head;
    if(NULL != *head)
    {
        (*head)->pre = n;
    }
    *head = n;
}

void travers(struct person *head, void (*fp)(struct person *))
{
    fp(head);
}


void show(struct person *head)
{
    if(NULL == head)
    {
        return;
    }
    while(head)
    {
        if(0 == strcmp(head->labe, "jack"))
        {
            travers(head,print_jack);
        }
        else
        {
            travers(head,print_fuck);
        }
        head = head->next;
    }
}


void delete(struct person *head,void *key)
{
    int ret = 0;
    struct person *past = head;
    struct person *curr = past;

    while(curr)
    {
        if(0 == strcmp(curr->labe,"jack"))
        {
            if(0 == strcmp(((struct jack *)curr)->name, (char *)key))
            {
                past->next = curr->next;
                free(curr);
                curr = NULL;
                ret += 1;
            }
        }
        else
            if(0 == strcmp(curr->labe,"fuck"))
            {
                if(0 == strcmp(((struct fuck *)curr)->name, (char *)key))
                {
                    past->next = curr->next;
                    free(curr);
                    curr = NULL;
                    ret += 1;
                }
            }
        if(0 == ret)
        {
            past = curr;
            curr = curr->next;
        }
    }
}

int main()
{
    int i = 5;
    char jack[5][10] = {"jack_1","jack_2","jack_3","jack_4","jack_5"};
    char jfd[10] = {"orange"};
    char fuck[5][10] = {"fuck_1","fuck_2","fuck_3","fuck_4","fuck_5"};
    char ffd[10] = {"apple"};
    struct person *head = NULL;

    while(i--)
    {
        struct jack *j = (struct jack *)malloc(sizeof(struct jack));

        strcpy(j->name,jack[i]);
        strcpy(j->food,jfd);
        j->p.labe = "jack";
        head_list(&head,&j->p);

        struct fuck *f = (struct fuck *)malloc(sizeof(struct fuck));

        strcpy(f->name,fuck[i]);
        strcpy(f->food,ffd);
        f->p.labe = "fuck";
        head_list(&head,&f->p);
    }

    printf("=============\n");
    delete(head,"fuck_1");
    show(head);
    return 0;
}

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct person
{
    char *labe;
    struct person *pre;
    struct person *next;
};

struct jack
{
    struct person p;
    char name[10];
    char food[10];
};

struct fuck
{
    struct person p;
    char name[10];
    char food[10];
};

void print_jack(struct person *curr)
{
    struct jack *t = (struct jack *)curr;

    printf("%s eat %s\n",t->name,t->food);
}

void print_fuck(struct person *curr)
{
    struct fuck *t = (struct fuck *)curr;

    printf("%s eat %s\n",t->name,t->food);
}

void head_list(struct person **head, struct person *n)
{
    n->pre = NULL;
    n->next = *head;
    if(NULL != *head)
    {
        (*head)->pre = n;
    }
    *head = n;
}

void travers(struct person *head, void (*fp)(struct person *))
{
    fp(head);
}


void show(struct person *head)
{
    if(NULL == head)
    {
        return;
    }
    while(head)
    {
        if(0 == strcmp(head->labe, "jack"))
        {
            travers(head,print_jack);
        }
        else
        {
            travers(head,print_fuck);
        }
        head = head->next;
    }
}


void delete(struct person **head,void *key)
{
    int ret = 0;
    struct person *past = *head;
    struct person *curr = past;

    while(curr)
    {
        if(0 == strcmp(curr->labe,"jack"))
        {
            if(0 == strcmp(((struct jack *)curr)->name, (char *)key))
            {
                if (curr == *head) {
                    (*head)->next->pre = (*head)->pre;
                    (*head) = (*head)->next;
                } else {
                    curr->next->pre = past;
                    past->next = curr->next;
                }
                free(curr);
                curr = NULL;
                ret += 1;
            }
        }
        else if(0 == strcmp(curr->labe,"fuck")) {
            if(0 == strcmp(((struct fuck *)curr)->name, (char *)key))
            {
                if (curr == *head) {
                    (*head)->next->pre = (*head)->pre;
                    (*head) = (*head)->next;
                } else {
                    curr->next->pre = past;
                    past->next = curr->next;
                }
                //past->next = curr->next;
                //curr->next->pre = past;
                free(curr);
                curr = NULL;
                ret += 1;
            }
        }
        if(0 == ret)
        {
            past = curr;
            curr = curr->next;
        }
        printf("helloworld!\n");
    }
}


void del_person(struct person **head,void *key)
{
    int ret = 0;
    struct person *past = *head;
    struct person *curr = past;

    while(curr)
    {

        if( (0 == strcmp(curr->labe,"jack") && 0 == strcmp(((struct jack *)curr)->name, (char *)key))
               || (0 == strcmp(curr->labe,"fuck") && 0 == strcmp(((struct fuck *)curr)->name, (char *)key))) {
                if (curr == *head) {
                    (*head)->next->pre = (*head)->pre;
                    (*head) = (*head)->next;
                } else {
                    curr->next->pre = past;
                    past->next = curr->next;
                }
                free(curr);
                curr = NULL;
                ret += 1;
        }
        if(0 == ret)
        {
            past = curr;
            curr = curr->next;
        }
    }
}

int main(void)
{
    int i = 5;
    char jack[5][10] = {"jack_1","jack_2","jack_3","jack_4","jack_5"};
    char jfd[10] = {"orange"};
    char fuck[5][10] = {"fuck_1","fuck_2","fuck_3","fuck_4","fuck_5"};
    char ffd[10] = {"apple"};
    struct person *head = NULL;

    while(i--)
    {
        struct jack *jk = (struct jack *)malloc(sizeof(struct jack));

        strcpy(jk->name,jack[i]);
        strcpy(jk->food,jfd);
        jk->p.labe = "jack";
        head_list(&head,&jk->p);

        struct fuck *fk = (struct fuck *)malloc(sizeof(struct fuck));

        strcpy(fk->name,fuck[i]);
        strcpy(fk->food, ffd);
        fk->p.labe = "fuck";
        head_list(&head, &fk->p);
    }

    printf("Show list: \n");
    show(head);
    printf("=============\n");
    delete(&head, "fuck_1");
    //del_person(&head, "fuck_1");
    printf("Show list(After delete fuck_1): \n");
    show(head);
    return 0;
}

参考一下吧。delete函数逻辑是有问题的,上面是已经改过的。
另外,考虑你的delete函数代码逻辑有冗余,所以用del_person函数重写了你的这个功能。建议多测试删除的情况,这是删除头,试着删除中间节点和尾节点,都试试看看有没有问题。
看你的这个链表数据结构设计比较独特,看着像内核的链表结构设计。

感谢,还要考虑最后一个的情况,加上
 while(curr)
    {
        if(0 == strcmp(curr->labe,"jack"))
        {
            if(0 == strcmp(((struct jack *)curr)->name, (char *)key))
            {
                if(curr == *head)
                {
                    (*head)->next->pre = (*head)->pre;
                    *head = (*head)->next;
                }
                if(curr->next == NULL)  //考虑最后一个
                {
                    curr->pre->next = NULL;
                }
                else
                {
                    curr->next->pre = past;
                    past->next = curr->next;
                }
                free(curr);
                curr = NULL;
                ret += 1;
            }
        }

引用 2 楼 biu__biu_biu 的回复:
感谢,还要考虑最后一个的情况,加上
 while(curr)
    {
        if(0 == strcmp(curr->labe,"jack"))
        {
            if(0 == strcmp(((struct jack *)curr)->name, (char *)key))
            {
                if(curr == *head)
                {
                    (*head)->next->pre = (*head)->pre;
                    *head = (*head)->next;
                }
                if(curr->next == NULL)  //考虑最后一个
                {
                    curr->pre->next = NULL;
                }
                else
                {
                    curr->next->pre = past;
                    past->next = curr->next;
                }
                free(curr);
                curr = NULL;
                ret += 1;
            }
        }

不用考虑,因为你的是双向循环链表。所以没有指向NULL的节点,最后一个节点的next指向head

推荐阅读

热门内容

求助一个计算问题?

#include in...

请解惑,关于QT用C++写串口通信时的一

我把代码贴出来吧,请帮我看看是哪里出了问...

已添加头文件,但报错找不到标识符

引用错误1error C3861: “r...

错误2365,怎么解决啊,求助

如图这么多短变量名放一块儿,很容易重名的...

感觉现代c++不如d语言

功能都是那些功能,现代c++的实现语法太...

逐行读取文件+并发处理,和先读入整个文件

文本的每一行都是一条记录,程序要求对每条...

C语言新手求助,输出的数字非常大

本帖最后由z4164362于2017-0...

c小白 求帮帮忙

# include #...

求助,对使用什么软件比较迷茫

我现在使用VS2017在对一个曲柄滑块机...

关于c语言图形界面的光条式菜单问题

本帖最后由qq_40091933于201...

最新内容

链表删除节点问题

delete函数不能删除第一个节点(fuck_1),出现段错误;请教各位大佬,错...

安全扫描工具 AppScan

  IBMRationalAppScan是一个面向Web应用安全检测的自动化工具...

如何负责一个项目的质量保证工作?

  问题  通常,我在面试测试相关候选人时,除了技术等硬性标准外,我还非常希望候...

关于SQLite数据插入

我做了一个界面界面想把数据插入到SQLite中,但是每次点击保存到数据库就会闪退...

敏捷测试的“要”与“不要”

  最近在看CraigLarman和BasVodde写的Practicesfor...

duilib的使用listEx多次删除崩溃问题

有没有大神对duilib比较熟悉,我用duilib做了一个窗口程序,上面有三个按...

AndroidStudio 在dimens文件中定义宽高并使用后,每次重新打开布局文件都会被改回实际值

AndroidStudio 在dimens文件中定义宽高并使用后,每次重新打开布...

教你一招:基于数据驱动的接口单元测试

  1、前言  Hello,小伙伴们,本文将继续分享基于数据驱动的接口单元测试自...

触摸Java常量池

  java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,小菜早就...

国庆不去哪儿:用python爬虫爬取热门景点并生成热力图

  前言:本文建议有一定Python基础和前端(html,js)基础的盆友阅读,...

兼顾稳定和性能,58大数据平台的技术演进与实践

  接下来我会跟大家分享一下58大数据平台在最近一年半的时间内技术演进的过程。主...

苹果超级泄密事件泄露了这次发布会的十大秘密

  网易科技讯9月12日消息,据CNET报道,在刚刚过去的这个周末,苹果遭遇了i...

不能都怪别人 你的个人信息可能是这么泄露的

  个人信息小偷“内鬼”多,“家贼”难防怎么办?惩罚加重!侵犯公民个人信息犯罪是...

中国网络安全人才奇缺 企业为招人已饥不择食

  梦想一份几乎不要求任何经验、薪酬却比求职者平均期望值高出约1/4的工作吗?在...

一个完全独立的C程序如何嵌入到QT程序中,将原来的C程序的输入和输出都转化到QT窗口界面中的输入和输出??

一个完全独立的C程序如何嵌入到QT程序中,将原来的C程序的输入和输出都转化到QT...

安卓之父Essential手机跌落测试:陶瓷果然耐摔

  昨天我们报道了知名测试达人JerryRigEverything带来的安卓之父...

请问这个从网站API取得的JSON反序列化如果构建类?

{    "HeWeather5": [        {           ...

winform在TreeView上单击子节点取到imageindex的值为-1

winform运行后在TreeView上单击子节点取到imageindex的值为...

c# 引用webservice 出现问题,如下图

我在浏览器浏览没问题就是在项目中添加服务引用的时候出现如图的问题,望指教!以下是...

小问题,求助

我在一个教学视频上看到的,老师在演示时,VS左边有小灯泡,小锤子 的提示,为什么...