首页 > 其他分享 >C 单向链表(尾插法)

C 单向链表(尾插法)

时间:2023-01-07 14:11:06浏览次数:39  
标签:插法 20 单向 链表 stu printf new 节点

初学数据结构,用C实现了一个简单的单向链表,用以存储和遍历查询学生信息,只有构造链表和遍历查询链表的功能,主要为了展示单向链表尾插法的实现,原创代码,不足之处还请多评论指正。

语言:C

编译环境:visual studio 2019

项目类型:控制台程序

  1 #include <stdio.h>
  2 #include <conio.h>
  3 #include <stdlib.h>
  4 //链表
  5 typedef struct Student//学生结构体
  6 {
  7     char name[20];//姓名
  8     int age;//年龄
  9     char sex[4];//性别
 10     int ID;//学号(不超过4位)
 11     char faculties[20];//院系
 12     char major[20];//专业
 13 }student;//别名
 14 
 15 typedef struct Node//链表节点结构体
 16 {
 17     student stu;//学生信息嵌套结构体
 18     Node* next;//指向下一个节点的指针
 19 }node;//别名
 20 
 21 //头节点结构体变量指针和指向上一个节点结构体变量的指针变量
 22 node* p_head = NULL;//头指针,指向头节点,初始化为空
 23 node* pre_n;//指向上一个节点结构体变量的指针变量
 24 
 25 //功能函数
 26 void add_student();//添加学生信息
 27 void print();//遍历打印学生信息
 28 
 29 int main()
 30 {
 31     while (1)//程序循环执行
 32     {
 33         printf("按1录入学生信息,按2打印学生信息,按3退出程序!\n");//打印提示信息
 34         while (1)//程序循环执行
 35         {
 36             char input = _getch();
 37             if (input == '1' || input == '2' || input == '3')
 38             {
 39                 if (input == '1')//input‘1’添加学生信息
 40                 {
 41                     add_student();
 42                     break;
 43                 }
 44                 else if (input == '2')//input‘2’查看学生信息
 45                 {
 46                     print();
 47                     break;
 48                 }
 49                 else if (input == '3')//input‘3’退出程序
 50                 {
 51                     return 0;//退出程序
 52                 }
 53             }
 54         }
 55     }
 56     return 0;
 57 }
 58 
 59 void add_student() //添加学生信息(尾插法)
 60 {
 61     node* p_new = (node*)malloc(sizeof(node));//申请动态内存,内存大小为节点构造体变量大小
 62     if (p_new == NULL)//判断内存是否申请成功
 63     {
 64         printf("动态内存申请失败!");
 65         system("pause");
 66         return;
 67     }
 68     printf("请输入学生的姓名:");
 69     char name[20];
 70     scanf_s("%s", name, 20);
 71     printf("请输入学生的年龄:");
 72     int age;
 73     scanf_s("%d", &age);
 74     printf("请输入学生的性别:");
 75     char sex[4];
 76     scanf_s("%s", sex,4);
 77     printf("请输入学生的学号(4位及4位以内):");
 78     int ID;
 79     scanf_s("%d", &ID);
 80     printf("请输入学生的所在学院院系:");
 81     char faculties[20];
 82     scanf_s("%s", faculties, 20);
 83     printf("请输入学生的专业:");
 84     char major[20];
 85     scanf_s("%s", major, 20);
 86     if (p_head == NULL)//当头节点指针为空时就表示没有头节点,为链表创建头节点,将刚分配的内存设为头节点
 87     {
 88         p_head = p_new;
 89     }
 90     else//如果已经有头节点,将新申请的内存地址赋给当前新节点的上一个节点,以此将链表串联起来
 91     {
 92         pre_n->next = p_new;
 93     }
 94     //依次按提示输入对应值并赋给结构体变量里的成员变量
 95     for (int i = 0; i < 20; i++)
 96     {
 97         p_new->stu.name[i] = name[i];
 98     }
 99     p_new->stu.age = age;
100     for (int i = 0; i < 4; i++)
101     {
102         p_new->stu.sex[i] = sex[i];
103     }
104     p_new->stu.ID = ID;
105     for (int i = 0; i < 20; i++)
106     {
107         p_new->stu.faculties[i] = faculties[i];
108     }
109     for (int i = 0; i < 20; i++)
110     {
111         p_new->stu.major[i] = major[i];
112     }
113     pre_n = p_new;//链接完链表以后将当前最后一个节点设为上一个节点,以便通过pre_n指针变量将后面一个即将申请的节点的内存地址赋给当前节点
114     p_new->next = NULL;//将当前节点的next指针变量设为空值,以便遍历链表和给next指针变量赋值
115     printf("录入成功!\n");
116     system("pause");
117     system("cls");
118 }
119 
120 void print()
121 {
122     if (p_head != NULL)//当头节点指针不为空时,链表中至少有一个节点
123     {
124         node* p = p_head;//声明一个指针p,将头节点指针p_head的值赋给p
125         while (p != NULL)//遍历链表,直到p->next为空(最后一个节点的next指针为空)
126         {
127             printf("*%s\t%d\t%s\t%d\t%s\t%s*\n", p->stu.name, p->stu.age, p->stu.sex, p->stu.ID, p->stu.faculties, p->stu.major);//依次打印该节点学生信息
128             p = p->next;//打印完当前节点,将p指向下一个节点的地址
129             printf("******************************\n");//隔开每个学生的信息
130         }
131     }
132     else//当头节点指针为空时,链表里面不存在任何节点
133     {
134         printf("当前学生表为空!\n");
135     }
136     system("pause");
137     system("cls");
138 
139 }

 

标签:插法,20,单向,链表,stu,printf,new,节点
From: https://www.cnblogs.com/mryang2001/p/17032571.html

相关文章

  • Python实现单项链表
    单向链表单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指......
  • 143. 重排链表
    问题链接https://leetcode.cn/problems/reorder-list/description/解题思路这题其实用list+双指针模拟。很简单。但我们要练习的是递归。这题我本来是想用递归的方......
  • 基于单链表的学生管理系统
    基于单链表的学生管理系统(Student-Management-System)学生管理系统(Student-Management-System)项目链接:https://github.com/caojun97/Student-Management-System一、......
  • 24. 两两交换链表中的结点
    题目链接https://leetcode.cn/problems/swap-nodes-in-pairs/description/解题思路首先这是个递归问题,因为它可以明显的缩小问题规模。既然是递归的问题,那我们按照递归......
  • 链表
    1.什么是链表链表(LinkedList):一种线性表数据结构。它使用一组任意的存储单元(可以是连续的,也可以是不连续的),来存储一组具有相同类型的数据。即「链表」是实现线性表......
  • list双链表
    structlistnode{structlistnode*next;structlistnode*prev;void*data;};structlist_head{ structlist_head*next,*prev;};/*Linkedlistof......
  • 静态链表
    以下是链表的相关实现函数单链表//head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点inthead,e[N],ne[N],idx;//初始化voidin......
  • python 删除链表倒数第n个节点
    defdelete_k_node(self,head,index):"""删除链表倒数第k个节点:paramhead::paramindex::return:"""......
  • C++实现有序表--链表的合并操作代码
    #include<iostream>#include<cstdlib>usingnamespacestd;#defineMAXSIZE100#defineOK1#defineERROR0typedefintElemtype;typedefintStatus;typedefstructLNo......
  • 单链表
    单链表typedefstructLNode{ElemTypedata;structLNode*next;}LNode,*LinkList1.不带头结点boolInitList(LinkList&L){L=NULL;returntr......