标题:编写程序:建立一个学生数据链表,每个结点信息包括如下内容:学号、姓名、 ...
只看楼主
lemonandtree
Rank: 2
等 级:论坛游民
帖 子:74
专家分:10
注 册:2017-10-5
结帖率:88.89%
已结贴  问题点数:20 回复次数:3 
编写程序:建立一个学生数据链表,每个结点信息包括如下内容:学号、姓名、性别、年龄和专业。
题目:编写程序:建立一个学生数据链表,每个结点信息包括如下内容:学号、姓名、性别、年龄和专业。对该链表作如下处理:(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);
}
搜索更多相关主题的帖子: 结点 专业 struct stu next 
2017-12-15 21:29
lemonandtree
Rank: 2
等 级:论坛游民
帖 子:74
专家分:10
注 册:2017-10-5
得分:0 
”,我输入art就不能上去后面的art了
漏了个删字。。。。
2017-12-15 21:31
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:20 
#include<iostream>
using namespace std;
#define  null 0
struct stu*creat();
void h(char*s);//定义h函数来删除结点
struct stu
{
    int num;
    char name[10];
    char sex[5];
    int age;
    char major[20];
    struct stu*next;
};
struct stu*head;
void main()
{
    struct stu*p;
    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;
    //p=head;//头结点指向p
    //if(strcmp(s,q->major)==0)
        //head=&b;
    //else
    h(s);
    cout<<"*******************"<<endl;
  while(head!=null)
  {
      cout<<head->major<<endl;//输出专业检验是否成功
      head=head->next;
  }
}
void h(char*s)
{
    struct stu*q=NULL;
    struct stu*p=head;
    while(p!=NULL)
    {
        if(strcmp(s,p->major)==0)
        {
            if(p==head)
            {
                q=p;
                p=p->next;
                head=p;//删掉第一个结点之后,p成为新的头节点
                q=NULL;//q指向空
            }
            else
            {
                q->next=p->next;//p的前驱的next指向p的后继
                p=q->next;//p指向下一结点
            }
        }
        else
        {
            q=p;
            p=p->next;
        }
    }
}
2017-12-16 21:38
lemonandtree
Rank: 2
等 级:论坛游民
帖 子:74
专家分:10
注 册:2017-10-5
得分:0 
冒昧的问一句
if(p==head)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q=p;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p=p->next;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; head=p;//删掉第一个结点之后,p成为新的头节点
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q=NULL;//q指向空
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
中的q=p;这一句有什么特定的作用,我把它删了之后测试也可以正常运行。
2017-12-17 15:24



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-483416-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019810 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved