学生链表创建、遍历和删除(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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include<stdio h> #include<stdlib h> #include<malloc h> #include<string h> struct Node { char name[20]; int score; struct Node next; }; 定义一个结构体 此结构体存储学生姓名 成绩以及指向该结构体的指针 typedef struct Node ListNode; ListNode CreateList int n ; 创建链表函数 返回创建链表的头指针 void InsertList ListNode h int i char name[] int score ; 插入结点函数 void DeleteList ListNode h int i int n ; 删除结点函数 void PrintList ListNode h ; 打印链表函数 int main { ListNode h; int i 1 n score; char name[20]; while i { printf "1 Create a new list n" ; printf "2 Add a new student"s information n" ; printf "3 Delete a student"s information n" ; printf "4 All student"s information n" ; printf "0 Quit n" ; scanf "%d" &i ; switch i { case 1: printf "Enter the number of students n n " ; scanf "%d" &n ; h CreateList n ; 创建链表 h是头指针 printf "List elements is: n" ; PrintList h ; break; case 2: printf "input the position of insert element:" ; scanf "%d" &i ; if i<1||i>n+1 控制条件 { printf "Error input n" ; break; } else { printf "input name of the student:" ; scanf "%s" name ; printf "input score of the student:" ; scanf "%d" &score ; InsertList h i name score ; printf "List elements is: n" ; PrintList h ; break; } case 3: printf "input the position of delete element:" ; scanf "%d" &i ; DeleteList h i n ; 调用删除结点函数 printf "list element is: n" ; PrintList h ; break; case 4: printf "list element is: n" ; PrintList h ; break; case 0: return; break; default: printf "illegal input " ; } } return 0; } ListNode CreateList int n { ListNode head; 定义头指针 ListNode p pre; int i; head ListNode malloc sizeof ListNode ; 给头结点分配空间 head >next NULL; 头结点的指针域为空 pre head; for i 1;i< n;i++ { printf "input name of the %d student:" i ; p ListNode malloc sizeof ListNode ; 创建一个新的结点 指针p指向它 scanf "%s" &p >name ; 给数据域赋值 printf "input score of the %d student:" i ; scanf "%d" &p >score ; 给数据域赋值 pre >next p; pre p; } p >next NULL; 最后一个结点指针域为空 return head; } void PrintList ListNode h { ListNode p; p h >next; p指向首元结点 while p { printf "%s %d" p >name p >score ; p p >next; 依次遍 每访问完一个结点p指向下一个结点 printf " n" ; } } void InsertList ListNode h int i char name[] int e { ListNode q p; int j 0; p h; for j 0;j<i 1;j++ p指向第i 1个结点 { p p >next; } q ListNode malloc sizeof ListNode ; 创建个新结点 q指向它 strcpy q >name name ; q >score e; q >next p >next; q指向的结点的指针域指向第i个结点 p >next q; 第i 1个结点指向第i个结点 } void DeleteList ListNode h int i int n { ListNode p q; int j; char name[10]; int score; if i<1||i>n printf "illegal input n" ; else { j 0; p h; for j 0;j<i 1;j++ p指向第i 1个结点 { p p >next; } q p >next; q指向第i个结点 p >next q >next; 第i 1个结点的指针域指向第i+1个 strcpy name q >name ; score q >score; free q ; printf "name %s score %d n" name score ; 把删除的结点的数据域输出 } }">#include<stdio h> #include<stdlib h> #include<malloc h> #include<string h> struct Node { char name[20]; int score; struct Node next; }; 定义一个结构体 此结构体存储学生姓名 成绩以及指向该结构体的指针 typedef struct Node ListNode; ListN [更多]
要定义一个学生链表,并完成建立链表、打印链表、插入链表删除链表的操作,可以按照以下步骤进行: 1. 首先,需要定义一个学生结构体,包含学生的信息,例如姓名、学号、年龄等。可以使用C语言的结构体来定义。 2. 接下来,可以定义一个链表节点的结构体,包含一个指向学生结构体的指针和一个指向下一个节点的指针。这个节点结构体可以命名为"Node"。 3. 在建立链表操作中,可以定义一个头节点指针,并初始化为NULL。然后,通过循环读取学生的信息,创建新的节点,并将学生信息存储到节点中。可以使用动态内存分配函数malloc来为节点分配内存。接着,将新节点插入到链表中,如果是第一个节点,则将头节点指针指向新节点;否则,将新节点插入到链表的末尾。 4. 在打印链表操作中,可以从头节点开始,遍整个链表,并依次输出每个节点中的学生信息。 5. 在插入链表操作中,可以先创建一个新节点,并将要插入的学生信息存储到节点中。然后,通过遍链表找到要插入的位置,并将新节点插入到链表中。 6. 在删除链表操作中,可以先找到要删除的节点,并将它从链表中断开。然后,通过释放内存函数free来释放该节点的内存。 请参考以上步骤,根据引用、引用和引用中提供的相关资料,完成定义学生链表并实现建立链表、打印链表、插入链表删除链表的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [c语言数组指定位置插入和删除-玩转C语言链表,单链表双向链表的建立遍插入删除... 数组和链表.pdf](https://download.csdn.net/download/qq_40464803/85167258)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [基于C++实现(控制台)实现链表的插入、删除、打印等操作的函数(线程安全型数据结构)【100012475】](https://download.csdn.net/download/s1t16/87819338)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C语言实现带头结点的链表创建、查找、插入、删除操作](https://download.csdn.net/download/weixin_38609693/12808442)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值