删除动态链表特定结点发生异常,坐等高人指点,如果各亲不仅指出异常还能给出正确的写法那就万分感谢了
删除动态链表特定结点发生错误,坐等高人指点,如果各亲不仅指出错误还能给出正确的写法那就万分感谢了。
#include<iostream.h>
#include<malloc.h>
typedef struct student
{
int m;
struct student *next;
}Node;
Node *creat()//头插法建立动态链表
{
Node *head,*p1;int flag=1,k;
head=(Node *)malloc(sizeof(Node));head->next=NULL;// 开辟头结点
while(flag)
{
cin>>k;//先判断再建立
if(k!=0)
{
p1=(Node *)malloc(sizeof(Node));
p1->m=k;
p1->next=head->next;
head->next=p1;
}
else flag=0;
}
return head;//返回头结点的地址
}
void print(Node *p2)//输出链表
{
p2=p2->next;
while(p2)
{
cout<<p2->m<<' ';
p2=p2->next;
}
}
void delist(Node *p3,int i)//删除特定结点
{
Node *pre,*r;int k=0;
while(pre->next!=NULL&&k<i-1)
{
pre=pre->next;
k++;
}
if(!(pre->next))
{
cout<<"删除结点的位置不合理";
}
r=pre->next;
pre->next=r->next;
free(r);
}
main()
{ Node *pt;
pt=creat();
print(pt);
delist(pt,2);
print(pt);
}
------解决方案--------------------
删除里面 pre 指向哪里啊?
------解决方案--------------------
delist函数添加返回值,返回0表示删除成功,返回1表示位置不存在,然后再main函数里判断返回值,如果是1就重新接受输入。
------解决方案--------------------
可以使用try{}catch(){},try插入,catch是否插入正确,最后重新输入。或者你用其他的逻辑写返回值判断,如5楼所说。一般不推荐使用goto
#include<iostream.h>
#include<malloc.h>
typedef struct student
{
int m;
struct student *next;
}Node;
Node *creat()//头插法建立动态链表
{
Node *head,*p1;int flag=1,k;
head=(Node *)malloc(sizeof(Node));head->next=NULL;// 开辟头结点
while(flag)
{
cin>>k;//先判断再建立
if(k!=0)
{
p1=(Node *)malloc(sizeof(Node));
p1->m=k;
p1->next=head->next;
head->next=p1;
}
else flag=0;
}
return head;//返回头结点的地址
}
void print(Node *p2)//输出链表
{
p2=p2->next;
while(p2)
{
cout<<p2->m<<' ';
p2=p2->next;
}
}
void delist(Node *p3,int i)//删除特定结点
{
Node *pre,*r;int k=0;
while(pre->next!=NULL&&k<i-1)
{
pre=pre->next;
k++;
}
if(!(pre->next))
{
cout<<"删除结点的位置不合理";
}
r=pre->next;
pre->next=r->next;
free(r);
}
main()
{ Node *pt;
pt=creat();
print(pt);
delist(pt,2);
print(pt);
}
------解决方案--------------------
删除里面 pre 指向哪里啊?
------解决方案--------------------
delist函数添加返回值,返回0表示删除成功,返回1表示位置不存在,然后再main函数里判断返回值,如果是1就重新接受输入。
------解决方案--------------------
可以使用try{}catch(){},try插入,catch是否插入正确,最后重新输入。或者你用其他的逻辑写返回值判断,如5楼所说。一般不推荐使用goto