学生链表创建、遍历和删除(C)

9 篇文章 0 订阅
9 篇文章 0 订阅

定义恰当的结构体,并编程实现下列函数,main()函数将调用这些函数,实现学生链表的创建、打印和删除节点的功能;

(1)create(n),从控制台输入n个学生的信息,建立链表存储这些信息,返回链表的头节点指针;学生信息包括:学号(字符串,少于20分字符)、姓名(字符串,少于10个字符)、性别(0表示女生、1表示男生)、年龄。

(2)pdelete(head,age),从head指向的链表搜索学生信息,当学生的年龄等于age时,将该节点删除;返回链表的头节点指针;

(3)print(head),输出删除后剩余学生的信息

输入样例:

(1)第一行输入学生数量n;

(2)后面输入n个学生信息,每一行输入一个学生的信息(依次为学号、姓名、性别、年龄)

(3)最后输入从链表中要删除学生的年龄。

如:

5
2021001 zhanli 1 20
2021002 liming 2 21
2021003 wuhang 1 22
2021004 mingti 2 21
2021005 lisung 2 21
21

输出样例:

输出删除了指定年龄后、剩余所有学生节点的信息(每个学生信息输出一行)。

2021001 zhanli 1 20
2021003 wuhang 1 22

 代码如下:

#include<stdio.h>
#include<stdlib.h>

//定义一个结构体
struct student
{
    char num[20];
    char name[10];
    int sex, age;
    struct student* next;
};

//输入链表中学生的信息
struct student* create(int n)
{
    struct student* pnew, * head, * ptail;//输入信息是三个指针 *head *pnew *ptail
    int i;
    //对头节点处理
    pnew = (struct student*)malloc(sizeof(struct student));//建立节点
    scanf("%s %s %d %d", pnew->num, pnew->name, &pnew->sex, &pnew->age);//储存学生信息
    head = ptail = pnew;//头、尾节点指向pnew
    //储存剩余 n - 1 个节点
    for (i = 1; i < n; i++)
    {
        pnew = (struct student*)malloc(sizeof(struct student));
        scanf("%s %s %d %d", pnew->num, pnew->name, &pnew->sex, &pnew->age);
        ptail->next = pnew;//将新的节点链接在尾节点后面
        ptail = pnew;//将尾节点指向新的节点
    }//for
    ptail->next = NULL;//最后尾节点的next指向NULL
    return head;//返回头节点的指针
}//create

//删除节点
struct student* pdelete(struct student *head, int age)//形参为头节点指针
{
    struct student* pold, * p;//删除节点两个指针 *pold *p
    //对头节点处理
    p = head;//将指针指向要处理的对象,方便后续释放内存空间
    while (head != NULL && head->age == age)
    {
        head = head->next;//删除头节点,直接将head移向下一个
        free(p);//释放内存
        p = head;//重新指向要处理的对象,避免出现野指针
    }//while
    if (head == NULL)//如果该链表为空则直接返回head
        return head;
    //对之后的节点进行处理
    p = p->next;//指向下一个节点
    pold = head;//始终前后要链接在一起
    while (p != NULL)
    {
        if (p->age == age)//如果满足删除条件
        {
            pold->next = p->next;
            free(p);
            p = pold->next;
        }//if
        else
        {
            pold = pold->next;//逐一指向下一个节点
            p = pold->next;

        }//else
    }//while
    return head;
}//pdelete

//输出链表中所有学生节点信息
void print(struct student *head) 
{
    struct student *p=head;
    if(head==NULL)//如果为空链表则输出链表为空!
        printf("链表为空!"); 
    while(p!=NULL)
    {
        printf("%s %s %d %d\n",p->num,p->name,p->sex,p->age);
        p=p->next;
    }//while

}print

int main()
{
    struct student *head;
    int n,age;
    scanf("%d",&n);
    head=create(n);//创建链表
    scanf("%d",&age);
    head=pdelete(head,age);//删除指定的年龄 
    print(head);//打印剩余节点 
    return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值