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

单链表删除节点操作,为什么执行到DeleteList()时程序错误停止

2013-12-22 
单链表删除节点操作,为什么执行到DeleteList()时程序异常停止#includestdio.h#includemalloc.htypedef

单链表删除节点操作,为什么执行到DeleteList()时程序异常停止
#include<stdio.h>
#include<malloc.h>

typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;

void CreatList(LinkList &L,int n,int *arr)
{
LinkList p;
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
for(int i=0;i<n;i++)
{
p=(LNode*)malloc(sizeof(LNode));
p->data=arr[i];
//scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
}

void DeleteList(LNode *&L,int i)
{
LinkList p,r;
int j=0;
p=L;
while(p&&j<i-1)
{
p=p->next;
printf("%d",p->data);
j++;
}
r=p->next;
p->next=r->next;
//e=r->data;
//free(r);
delete r;
}

main()
{
int n=5;int k;
LinkList L;
int arr[5]={5,4,3,2,1};


CreatList(L,n,arr);
printf("输出链表:");
for(int i=0;i<n;i++)
{
 printf("%d  ",L->next->data);
 L=L->next;
}
printf("\n");

printf("你想删除第几个节点?:");
scanf("%d",&k);
DeleteList(L,k);
printf("输出链表:");
for(i=0;i<4;i++)
{
 printf("%d  ",L->next->data);
 L=L->next;
}
printf("删除第%d个节点成功!",k);

return 0;
}
[解决办法]
你的void CreatList(LinkList &L,int n,int *arr)函数定义,是要传入一个LinkList的引用?如果是的话,这应该发C++那边去,因为在我的印象中C语言中没有引用。如果不是要传引用的话,这个代码就需要改了吧?
输出链表的时候更改了L的值:
printf("输出链表:");
for(int i=0;i<n;i++)
{
 printf("%d  ",L->next->data);
 L=L->next;
}
所以后面在Delete链表的时候,L已经没有指向链表头了,而是指向了链表的。。。所以你删除的时候会出错。
while(p&&j<i-1)
{
p=p->next;
printf("%d",p->data);
j++;
}
r=p->next;
如果上面的循环是因为p为空的时候才退出的,下面的代码就完蛋了。
[解决办法]

CreatList(L,n,arr);
printf("输出链表:");
LinkList tmp = L;
for(int i=0;i<n;i++)
{
printf("%d  ",tmp->next->data);
tmp=tmp->next;
}
printf("\n");


热点排行