链表删除问题,与常规删除节点不同

跃2.0 2017-07-31 04:48:25
删除要求:输入一个数字,查找所有此数字的节点全部删
我只能做到删除头,中间,末尾节点,单一的,如果有两个数是放在一起就会出现bug,甚至假如是3个数一起放在中间或者末尾又该怎么办。

void delet(int disnum,n *head) {
n t,q,p;
t=*head;
while(t) {
if(t->data==disnum) {
if(t==*head) {
*head=(*head)->next;

free(t);

} else if(t->next==NULL) {
q->next=NULL;
free(t);

} else { //bug everywhere
q->next=t->next;


free(t);
}
}
}
q=t;
t=t->next;
} //怎么把这个代码改造成我想要的,,,求助啊,,,,又没有逻辑了,,
...全文
110 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
跃2.0 2017-07-31
  • 打赏
  • 举报
回复
引用 2 楼 cfjtaishan 的回复:
void delet(int disnum, n *head)
{
    n p, q;

    p = q = *head;
    while (p) {
        if (p->data == disnum) {
            if (p == *head) {
                *head = (*head)->next;
                free(p);
                p = q = *head;
                continue;
            } else {
                q->next = p->next;
                free(p);
                p = q;
                p = p->next;
                continue;
            }
        }
        q = p;
        p = p->next;
    }
}
试一下这个版本。 以下是我的测试代码:
#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int data;
    struct node *next;
}*n;


n create_link(int num)
{
    int i;
    n p, q, phead = NULL;

    for (i = 0; i < num; i++) {
        p = (n)malloc(sizeof (struct node));
        if (!p) {
            fprintf(stderr, "malloc error!\n");
            exit(-1);
        }
        scanf("%d", &p->data);

        if (!phead) {
            phead = p;
            q = p;
        } else {
            q->next = p;
            q = p;
        }
    }
    q->next = NULL;

    return phead;
}

void print_link(n phead)
{
    n p = phead;

    while (p) {
        printf("%d\t", p->data);
        p = p->next;
    }
    putchar(10);
}

void delet(int disnum, n *head)
{
    n p, q;

    p = q = *head;
    while (p) {
        if (p->data == disnum) {
            if (p == *head) {
                *head = (*head)->next;
                free(p);
                p = q = *head;
                continue;
            } else {
                q->next = p->next;
                free(p);
                p = q;
                p = p->next;
                continue;
            }
        }
        q = p;
        p = p->next;
    }
}

int main(void)
{
    int num;
    n head;

    scanf("%d", &num);
    head = create_link(num);
    print_link(head);

    scanf("%d", &num);
    delet(num, &head);
    print_link(head);
    return 0;
}

你好棒棒啊,我去思考下你代码了,
跃2.0 2017-07-31
  • 打赏
  • 举报
回复
引用 2 楼 cfjtaishan 的回复:
void delet(int disnum, n *head)
{
    n p, q;

    p = q = *head;
    while (p) {
        if (p->data == disnum) {
            if (p == *head) {
                *head = (*head)->next;
                free(p);
                p = q = *head;
                continue;
            } else {
                q->next = p->next;
                free(p);
                p = q;
                p = p->next;
                continue;
            }
        }
        q = p;
        p = p->next;
    }
}
试一下这个版本。 以下是我的测试代码:
#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int data;
    struct node *next;
}*n;


n create_link(int num)
{
    int i;
    n p, q, phead = NULL;

    for (i = 0; i < num; i++) {
        p = (n)malloc(sizeof (struct node));
        if (!p) {
            fprintf(stderr, "malloc error!\n");
            exit(-1);
        }
        scanf("%d", &p->data);

        if (!phead) {
            phead = p;
            q = p;
        } else {
            q->next = p;
            q = p;
        }
    }
    q->next = NULL;

    return phead;
}

void print_link(n phead)
{
    n p = phead;

    while (p) {
        printf("%d\t", p->data);
        p = p->next;
    }
    putchar(10);
}

void delet(int disnum, n *head)
{
    n p, q;

    p = q = *head;
    while (p) {
        if (p->data == disnum) {
            if (p == *head) {
                *head = (*head)->next;
                free(p);
                p = q = *head;
                continue;
            } else {
                q->next = p->next;
                free(p);
                p = q;
                p = p->next;
                continue;
            }
        }
        q = p;
        p = p->next;
    }
}

int main(void)
{
    int num;
    n head;

    scanf("%d", &num);
    head = create_link(num);
    print_link(head);

    scanf("%d", &num);
    delet(num, &head);
    print_link(head);
    return 0;
}

谢谢
自信男孩 2017-07-31
  • 打赏
  • 举报
回复
void delet(int disnum, n *head)
{
    n p, q;

    p = q = *head;
    while (p) {
        if (p->data == disnum) {
            if (p == *head) {
                *head = (*head)->next;
                free(p);
                p = q = *head;
                continue;
            } else {
                q->next = p->next;
                free(p);
                p = q;
                p = p->next;
                continue;
            }
        }
        q = p;
        p = p->next;
    }
}
试一下这个版本。 以下是我的测试代码:
#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int data;
    struct node *next;
}*n;


n create_link(int num)
{
    int i;
    n p, q, phead = NULL;

    for (i = 0; i < num; i++) {
        p = (n)malloc(sizeof (struct node));
        if (!p) {
            fprintf(stderr, "malloc error!\n");
            exit(-1);
        }
        scanf("%d", &p->data);

        if (!phead) {
            phead = p;
            q = p;
        } else {
            q->next = p;
            q = p;
        }
    }
    q->next = NULL;

    return phead;
}

void print_link(n phead)
{
    n p = phead;

    while (p) {
        printf("%d\t", p->data);
        p = p->next;
    }
    putchar(10);
}

void delet(int disnum, n *head)
{
    n p, q;

    p = q = *head;
    while (p) {
        if (p->data == disnum) {
            if (p == *head) {
                *head = (*head)->next;
                free(p);
                p = q = *head;
                continue;
            } else {
                q->next = p->next;
                free(p);
                p = q;
                p = p->next;
                continue;
            }
        }
        q = p;
        p = p->next;
    }
}

int main(void)
{
    int num;
    n head;

    scanf("%d", &num);
    head = create_link(num);
    print_link(head);

    scanf("%d", &num);
    delet(num, &head);
    print_link(head);
    return 0;
}

赵4老师 2017-07-31
  • 打赏
  • 举报
回复
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧