m0_61890009 2022-04-19 14:31 采纳率: 95.5%
浏览 41
已结题

带头结点的单链表删除为x的节点,为什么输出不对

#include<stdio.h>
#include<stdlib.h>
typedef struct lnode{
int data;
struct lnode *next;
}lnode,*linklist ;
int a[4]={1,2,3,4};
int n=4;
void buildlist(linklist &L)
{
L=(linklist)malloc(sizeof(lnode));
lnode *s,*r=L;//数据指针,指向需要赋值的元素;p前驱指针,开始时指向表头
for(int i=0;i<n;i++)
{
s=(lnode *)malloc(sizeof(lnode));
s->data=a[i];
r->next=s;
r=r->next;
}
}
void disp(linklist L)
{
lnode *s=L->next;
while(s)
{
printf("%d",s->data);
s=s->next;
}
}
void deletex(linklist &L,int x)
{
lnode *p=L->next,*q,*r=L;
while(p)
{
if(p->data!=x)
{
r->next=p;
r=p;
p=p->next;
}
else
{
q=p;
p=p->next;
free(q);
}
}
}
int main()
{
linklist L;
buildlist(L);
disp(L);
deletex(L,3);
disp(L);
return 0;
}

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-04-19 15:50
    关注

    修改如下,供参考:

    #include<stdio.h>
    #include<stdlib.h>
    typedef struct lnode {
        int    data;
        struct lnode* next;
    }lnode, * linklist;
    int a[4] = { 1,2,3,4 };
    int n = 4;
    void buildlist(linklist& L)
    {
        L = (linklist)malloc(sizeof(lnode));
        lnode* s, * r = L;//数据指针,指向需要赋值的元素;p前驱指针,开始时指向表头
        for (int i = 0; i < n; i++)
        {
            s = (lnode*)malloc(sizeof(lnode));
            s->next = NULL;  //修改
            s->data = a[i];
            r->next = s;
            r = s;//r = r->next; 修改
        }
    }
    void disp(linklist L)
    {
        lnode* s = L->next;
        while (s)
        {
            printf("%d ", s->data);
            s = s->next;
        }
        printf("\n");
    }
    void deletex(linklist& L, int x)
    {
        lnode* p = L->next, * q, * r = L;
        while (p)
        {
            if (p->data != x)
            {
                //r->next = p;//修改
                r = p;        //修改
                p = p->next; 
            }
            else
            {
                q = p;      
                r->next = p->next;//修改
                //p = p->next;
                free(q);
                p = r;       //修改
            }
        }
    }
    int main()
    {
        linklist L;
        buildlist(L);
        disp(L);
        deletex(L, 3);
        disp(L);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月28日
  • 已采纳回答 4月20日
  • 创建了问题 4月19日

悬赏问题

  • ¥20 关于#目标检测#的问题:(qq收集表到时间才能填写,填写的份数有上限)
  • ¥50 ZYNQ7020双核FLAHS烧写的问题
  • ¥20 ue 5 中想要实现第一人称人物左右行走摆动的效果,摄像头只向右摆动一次(关键词-结点)
  • ¥15 钢岔管添加弹性约束模拟围岩作用
  • ¥15 AD9164瞬时带宽1.8G,怎么计算出来?
  • ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除
  • ¥15 使用MATLAB进行余弦相似度计算加速
  • ¥15 服务器安装php5.6版本
  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题