此代码为用双向动态链表记录并删除学生信息
为什么在delete函数里加入(curr->next)->pre=curr->pre后,先进行输入三个学生信息的操作,然后删除第三个学生信息的时候程序会**崩溃**
**目前注释了(curr->next)->pre=curr->pre;
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define LEN sizeof(struct Student)
typedef struct Student
{
long num;//学号
char name[20];//姓名
char sex[10];//性别
int age;//年龄
char phone[11];//电话
struct Student *next;
struct Student *pre;//双向动态链表
}Student;
//把head curr last定义为全局变量,下面函数就省下传参
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();//空出尾部,目的是使用free时候不崩溃?
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;
int c=1;
while(curr)
{
if(curr->num==num)
{
(curr->pre)->next = curr->next;
//(curr->next)->pre=curr->pre;/*如果不注释此代码,输入三个学生信息,删除第三个学生信息的时候系统就会崩溃?*/
free(curr);
cout<<"已经删除学生信息"<<endl;
c=0;
}
curr=curr->next;
}
if (c)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;
};