首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

链表节点删除的有关问题

2012-04-24 
链表节点删除的问题想通过输入一个已有的num值,然后删除其对应的节点,为什么总是删除不成功?将全部代码放

链表节点删除的问题
想通过输入一个已有的num值,然后删除其对应的节点,为什么总是删除不成功?将全部代码放在2楼,各位帮忙调试一下

C/C++ code
p1=heada;    printf("输入一个已有的num值\n");    scanf("%d",&k);    for(i=1;i<=N;i++)//开始删除链表中num值与k相等的节点    {          if(i==1&&k==1) heada=p1->point;         if(i==2) p2=heada;         if(p1->num==k&&i!=1)         {            p2->point=p1->point;            p1=p1->point;        }        p1=p1->point;        p2=p2->point;    }


[解决办法]
完整的代码还给你了,你写的代码对齐的,还有不要全在main函数中写,可以多写几个小函数,具体的代码风格跟函数就不帮你改了,

/*将两个链表a,b中num值相同的节点从a链表中删除,然后将2个链表合并,对num值排序,然后输入一个已有的num值,删除该num值所在的节点*/

#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct a)
#define N 5//定意义常量N
struct a//定义第一个链表节点内容
{
int num;
struct a *point;
};
struct b//定义第二个链表节点内容
{
int num;
struct b *point;
};
void main()
{
printf("程序测试开辟两个长度为N=(%d)的链表,各对两个链表内成num成员赋值\n,然后将第一链表中num值与第二链表中num值相等的节点删除,\n然后合并成一个链表并对其排序,然后输入一个已有的num值,将与这个num值相等的节点删除!\n,N");
struct a *heada,*p1,*p2,*pend;
struct b *headb,*p3,*p4;
int i,j,t,k;
for(i=1;i<=N;i++)//开始开辟第一个链表空间,链表长度为N
{
if(i==1) heada=p1=p2=(struct a *)malloc(LEN);
else p2=p1;
p1->num=i;//为第一个链表num成员赋值,用于测试数据
p1=(struct a *)malloc(LEN);
p2->point=p1;
}
p2->point=0;
printf("测试第一个链表开辟是否成功\n");
p1=heada;
while(p1->point!=0)
{
printf("%d ",p1->num);
p1=p1->point;
}
printf("%d\n",p1->num);
for(i=1;i<=N;i++)//开始开辟第二个链表空间,链表长度为N
{
if(i==1) headb=p3=p4=(struct b *)malloc(LEN);
else p4=p3;
p3->num=i*2;//为第二个链表num成员赋值,用于测试数据,为避免测试数据与链表1完全相同,使i+2
p3=(struct b *)malloc(LEN);
p4->point=p3;
}
p4->point=0;
printf("测试第二个链表开辟是否成功\n");
p3=headb;
while(p3->point!=0)
{
printf("%d ",p3->num);
p3=p3->point;
}
printf("%d\n",p3->num);
for(i=1;i<=N;i++)//开始检查两个链表中相同数据的节点,并从第一个链表中将其删除
{
if(i==1)//先将指向两个链表的指针指向表头
p3=headb;
p1=heada;//

for(j=1;j<=N;j++)
{
if(j==2)
p2=heada;
if(p1!=NULL&&p3!=NULL) //判断是否为空
{
if(p1->num==p3->num&&j==1)
heada=p1->point;
if(p1->num==p3->num&&j>1)
{
p2->point=p1->point;
p1=p1->point;
}
p1=p1->point;
p2=p2->point;
}
}
p3=p3->point;
}
printf("测试第一个链表删除是否成功\n");
p1=heada;
while(p1->point!=0)
{
printf("%d ",p1->num);
p1=p1->point;
}
printf("%d\n",p1->num);
pend=p1;
for(i=1;i<=N;i++)//开始合并链表
{
if(i==1)
{
pend->point=(struct a *)malloc(LEN);//将p1原本指向0的指针指向新开辟的空间
p2=pend=pend->point;
p3=headb;//将p3重新指向第2个链表的表头

}
else p2=pend;
p2->num=p3->num;
pend=(struct a *)malloc(LEN);
p2->point=pend;
p3=p3->point;
}
p2->point=0;
printf("检查合并是否成功!\n");
p1=heada;
while(p1->point!=0)
{
printf("%d ",p1->num);
p1=p1->point;
}
printf("%d\n",p1->num);


p1=p2=heada;
for(i=1;i<=N;i++)//开始对链表内的数值排序
{
p2=p1->point;
for(j=i+1;j<=N;j++)
{
if(p1->num>p2->num)
{
t=p1->num;
p1->num=p2->num;
p2->num=t;
}
p2=p2->point;
}
p1=p1->point;
}
printf("检查排序是否成功!\n");
p1=heada;
while(p1->point!=0)
{
printf("%d ",p1->num);
p1=p1->point;
}
printf("%d\n",p1->num);
p1=heada;
printf("输入一个已有的num值\n");
scanf("%d",&k);
for(i=1;i<=N;i++)//开始删除链表中num值与k相等的节点
{
if(i==1&&k==1) heada=p1->point;
if(i==2) p2=heada;
if(p1->num==k&&i!=1)
{
p2->point=p1->point;
p1=p1->point;
}
p1=p1->point;
p2=p2->point;
}
printf("检查删除是否成功!\n");
p1=heada;
while(p1->point!=0)
{
printf("%d ",p1->num);
p1=p1->point;
}
printf("%d\n",p1->num);

printf("\n---------------------------------\n");
getchar();
getchar();
}

[解决办法]
删除节点的做法是,把要删除的前一个节点的*next的地址更换成要删除节点的下一个节点地址...

热点排行