初学数据结构,用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