单链表删除节点操作,为什么执行到DeleteList()时程序错误停止
单链表删除节点操作,为什么执行到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为空的时候才退出的,下面的代码就完蛋了。
------解决方案--------------------
#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");