编写程序:建立一个学生数据链表,每个结点信息包括如下内容:学号、姓名、性别、年龄和专业。
题目:编写程序:建立一个学生数据链表,每个结点信息包括如下内容:学号、姓名、性别、年龄和专业。对该链表作如下处理:(1)输入一个学号,如果链表中的结点中包含该学号,则将此结点删去(最多只有一个节点)。(2)输入一个专业,如果链表中的结点包含该专业,则将此结点删去(可能有多个节点)。这是我自己写的代码,我的问题是:我可以处理除了第一个也就是a以外的结点,如果把a中struct stu a={1,"mike","m",17,"a"}的专业改成“art”,我输入art就不能上去后面的art了,我想问一下有什么办法可以改进吗,我本来想用递归来实现,可是不知道如何下手。如能赐教,不胜感激。
程序代码:#include<iostream>
using namespace std;
#define null 0
struct stu*creat();
void h(char s[20],struct stu*p,struct stu*q);//定义h函数来删除结点
struct stu
{
int num;
char name[10];
char sex[5];
int age;
char major[20];
struct stu*next;
};
void main()
{
struct stu*head,*p,*q;
struct stu a={1,"mike","m",17,"a"};
struct stu b={2,"bob","m",18,"finance"};
struct stu c={3,"sam","f",17,"art"};
struct stu d={4,"jack","m",19,"art"};
struct stu e={5,"jane","f",18,"accountant"};
a.next=&b;b.next=&c;c.next=&d;d.next=&e;e.next=null;//构建简单链表
int n,i;
char s[20];
scanf("%s",s);
head=&a;
q=head;//设置p,q分别指向第一第二个结点
p=&b;
if(strcmp(s,q->major)==0)
head=&b;
else
h(s,p,q);
cout<<"*******************"<<endl;
while(head!=null)
{
cout<<head->major<<endl;//输出专业检验是否成功
head=head->next;
}
}
void h(char s[20],struct stu*p,struct stu*q)
{
do{
if(strcmp(s,p->major)==0)
{
q->next=p->next;//把p所指向的结点删去
p=p->next;//p指向下一个结点
continue;//直接进行下一次循环,从而删除多个专业为s的结点
}
p=p->next;//如果此时的结点中专业不为s,则q,p结点都向后移动一位
q=q->next;
}while(p!=null);
}


