问题描述
- 双向动态链表存在学生信息!删除第一个学生信息时程序崩溃?
-
//输入学生信息后,凡是删除第一个学生的信息程序都会崩溃??#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; #define LEN sizeof(struct Student) struct Student //完全可以把结构当成类,只是访问权限不一样 { long num;//学号 char name[20];//姓名 char sex[10];//性别 int age;//年龄 char phone[11];//电话 struct Student *next; struct Student *pre;//双向动态不熟悉? }; struct Student *curr,*head=NULL,*last; void creat(void) { while(1) { curr=(struct Student *)new Student(); cout<<"请输入学生学号"<<endl; cin>>curr->num; cout<<"请输入学生姓名"<<endl; cin>>curr->name cout<<"请输入学生性别"<<endl; cin>>curr->sex; cout<<"请输入学生年龄"<<endl; cin>>curr->age; cout<<"请输入学生电话"<<endl; cin>>curr->phone; if(head==NULL){ head=curr; last=curr; curr->pre=NULL; curr->next=NULL; }else{ last->next=curr; curr->next=NULL; curr->pre=last; last=curr; } cout<<"请选择操作,1表示继续录入,2表示结束"<<endl; int b; cin>>b; if(b==1)continue; else break; } } void print(int num)//链表的print函数,以结构体指针为参数 { curr=head; int a=0; while(curr) { if(curr->num==num) { cout<<"学号"<<curr->num<<endl; cout<<"姓名"<<curr->name<<endl; cout<<"性别"<<curr->sex<<endl; cout<<"年龄"<<curr->age<<endl; cout<<"电话"<<curr->phone<<endl; a=1; break; } curr=curr->next; } if(a==0) { cout<<"查无此人"<<endl; } } void Delete(int num) { curr=head; while(curr) { if(curr->num==num) { (curr->pre)->next = curr->next; free(curr); } else { curr=curr->next; } } cout<<"已经删除学生信息"<<endl; } int main() { // head=creat();//返回第一个结点的地址 while(1) { cout<<"请选择你的操作"<<endl; cout<<"1:学生信息录入"<<endl; cout<<"2:学生信息查询"<<endl; cout<<"3:请输入删除学生的学号"<<endl; cout<<"4:退出"<<endl; int choice=0; cin>>choice;//输入选择 if(choice==1) { cout<<"请输入学生的信息"<<endl; creat();//返回第一个结点的地址 } if(choice==2) { cout<<"请输入你查询的学生的学号"<<endl; int a ; cin>>a ; print(a); } if(choice==3) { cout<<"请输入你想要删除学生的学号"<<endl; int a; cin>>a; Delete(a) ; } if(choice==4) break; } return 0; };
解决方案
//这是我最新修改后的代码
//空出头部和尾部,谢谢大家的指点啦!
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define LEN sizeof(struct Student)
struct Student //完全可以把结构当成类,只是访问权限不一样
{
long num;//学号
char name[20];//姓名
char sex[10];//性别
int age;//年龄
char phone[11];//电话
struct Student *next;
struct Student *pre;//双向动态不熟悉?
};
struct Student *curr,*head=NULL,*last;
void creat(void)
{
while(1)
{
curr=(struct Student *)new Student();
cout<<"请输入学生学号"<<endl;
cin>>curr->num;
cout<<"请输入学生姓名"<<endl;
cin>>curr->name;
cout<<"请输入学生性别"<<endl;
cin>>curr->sex;
cout<<"请输入学生年龄"<<endl;
cin>>curr->age;
cout<<"请输入学生电话"<<endl;
cin>>curr->phone;
if(head==NULL){
head=(struct Student*)new Student();//空出头部
head->next=curr;
curr->pre=head;
last=curr;
}else{
last->next=curr;
curr->next=NULL;
curr->pre=last;
last=curr;
}
cout<<"请选择操作,1表示继续录入,2表示结束"<<endl;
int b;
cin>>b;
if(b==1)continue;
else if(b==2)
{
last= (struct Student*)new Student();//空出尾部
last->pre=curr;
break;
}
}
}
void print(int num)//链表的print函数,以结构体指针为参数
{
curr=head;
int a=0;
while(curr)
{
if(curr->num==num)
{
cout<<"学号"<<curr->num<<endl;
cout<<"姓名"<<curr->name<<endl;
cout<<"性别"<<curr->sex<<endl;
cout<<"年龄"<<curr->age<<endl;
cout<<"电话"<<curr->phone<<endl;
a=1;
break;
}
curr=curr->next;
}
if(a==0)
{
cout<<"查无此人"<<endl;
}
}
void Delete(int num)
{
curr=head;
while(curr)
{
if(curr->num==num)
{
(curr->pre)->next = curr->next;
free(curr);
}
else
{
curr=curr->next;
}
}
cout<<"已经删除学生信息"<<endl;
}
int main()
{
// head=creat();//返回第一个结点的地址
while(1)
{
cout<<"请选择你的操作"<<endl;
cout<<"1:学生信息录入"<<endl;
cout<<"2:学生信息查询"<<endl;
cout<<"3:请输入删除学生的学号"<<endl;
cout<<"4:退出"<<endl;
int choice=0;
cin>>choice;//输入选择
if(choice==1)
{
cout<<"请输入学生的信息"<<endl;
creat();//返回第一个结点的地址
}
if(choice==2)
{
cout<<"请输入你查询的学生的学号"<<endl;
int a ;
cin>>a ;
print(a);
}
if(choice==3)
{
cout<<"请输入你想要删除学生的学号"<<endl;
int a;
cin>>a;
Delete(a) ;
}
if(choice==4)
break;
}
return 0;
};
解决方案二:
void Delete(int num)
{
curr=head;
while(curr)
{
if(curr->num==num)
{
(curr->pre)->next = curr->next;
free(curr);
break; //加上
}
else
{
curr=curr->next;
}
}
cout<<"已经删除学生信息"<<endl;
}
解决方案三:
Delete函数中,(curr->pre)—>next这句错误。curr—>pre是null指针,不是对象,没有next成员,造成错误。
一般我们都在链表头部再加一个头节点,方便操作。
解决方案四:
除了curr—>pre是null指针,还要(curr->next)—>pre = curr—>pre
时间: 2024-09-05 18:16:13