编写程序:建立一个学生数据链表,每个结点信息包括如下内容:学号、姓名、性别、年龄和专业。
题目:编写程序:建立一个学生数据链表,每个结点信息包括如下内容:学号、姓名、性别、年龄和专业。对该链表作如下处理:(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); }