/*
链表三要素
1)头指针(head):是用来说明链表开始了,头指针就代表链表本身
所以以后要访问链表,就要访问头指针
2)结点(node):链表中每一个结构体变量
3)尾指针:用来说明链表的结束(它是一个空指针,NULL)
*/
#include<stdio.h> #include<string.h> typedef struct stud //定义了一个结构体 { char Id[
10];//工号 char Name[10];//姓名 int pay;//工资 int Age;//年龄 struct stud *Next; }STU;
//这个指针的类型是结构类型,以后这个指针就只能够指向struct stud这种 STU *CreatLink(STU a[], int n)
//要返回链表实际上就是要返回头指针 { STU *head; int i; head = &a[0];
//表示把数组a中的第一个元素赋给头指针,让头指针指向第一个结点 //用循环把前一个结点与后一个结点通过next指针联系起来 for (i = 0; i < n
- 1; i++) { a[i].Next = &a[i + 1]; } a[n - 1].Next = NULL;//退出循环后,把末指针作为NULL
return head;//返回头指针,实际上代表链表本身 } //链表的查找 void FindById(STU *head, char Id[])
//在一个链表中查找指定的工号 { //要访问链表中的所有节点 STU *p = head;//把链表的头指针赋给p while (p!=NULL) {
//p就代表链表中每一个结点,如果p所指向那个结点的id与我们要找的id相同的话 //则退出循环 if (strcmp(p->Id, Id) == 0) {
break;//说明找到了,就没必要循环了 } p = p->Next; } //退出循环后,再来判断是否找到了 if (p==NULL)//没有找到 {
printf("找不到此鸟人"); } else//说明找到了 { //输出指针所指向的那个结点的值 printf("%s\t%s\t%d\t%d\n", p
->Id, p->Name,p->pay,p->Age); } } //链表的删除 //1:找到要删除的结点 //2:删除
//3:该函数要返回删除之后新链表,实际上返回头指针 STU *DelById(STU *head, char Id[])//根据工号去删除对应链表中的一个结点
{ //必须要找到该节点 STU *p = head, *front; while (p!=NULL) { if (strcmp(p->Id,Id)==0)
//如果p所指向的结点的id等于要删除的id的话 { break;//就退出循环 } //在p移动之前,要保留以前的位置 front = p; p = p->
Next;//p移动向下一个结点 } if (p != NULL)//说明找到要删除的结点 { front->Next = p->Next; } return
head; } //链表的插入 //1:找到要插入的位置 //2:执行插入操作 //插入一个节点,并且要返回插入之后的链表 STU *Insert(STU *
head, STU *pNewNode) { STU *p, *front; p = head; while (p!=NULL&&p->Age<pNewNode
->Age)//如果返现p所指向的年龄比新节点的年龄小的话,就不断循环 { front = p; p = p->Next; } //退出循环之后,检查下p的状态
if (p==head)//说明新的节点应该插入在开头 { //新节点的next要指向以前的head pNewNode->Next = head;
//新的head要指向插入的节点 head = pNewNode; } else { if (p == NULL)//说明新的节点应该插入到尾 { front
->Next = pNewNode;//把front的next指向新的节点 pNewNode->Next = NULL;//再把新的节点的next赋为NULL
} else //在中间插入(在p的前面插入) { //把front的next指向新的节点 front->Next = pNewNode;
//把新节点的next指向p pNewNode->Next = p; } } return head;//返回指针,就是返回链表 } //输出链表中所有结点值
void OutputLink(STU *head)//参数需要一个链表,一个链表实际上就是需要头指针 { STU *p = head;
//先把链表的头指针给指针p printf("工号\t姓名\t工资\t年龄\n"); while (p != NULL)//当访问的结点不到末尾的时候 {
printf("%s\t%s\t%d\t%d\n", p->Id, p->Name,p->pay,p->Age); p = p->Next;
//把指针p移到下一个结点 } printf("**************************\n"); } void main() { STU a[5]
= { {"001","小米",6000,20}, {"002","小明",5000,30}, {"003","小号",3000,40}, {"004",
"小傻",30000,50}, {"005","小二",20000,60} }, *head, NewNode = {"006","小样",1900,29},*
pNewNode=&NewNode; char id[100]; //现在还是一个数组,还不是一个链表,所以调用CreatLink来创建一个链表 head =
CreatLink(a, 5); OutputLink(head); //printf("请输入一个工号:\n");
//gets_s(id,60);//gets(id); //FindById(head, id); //head = DelById(head,
id);//调用DelById来删除一个节点,但是看不到效果 //为看到效果应该再输出一次 head = Insert(head, pNewNode);
OutputLink(head); }

技术
©2019-2020 Toolsou All rights reserved,
大一上c语言学生管理系统(下)年底了,不要跳槽。字节跳动测试工程师凉经分享教你用Python画一棵圣诞树用C实现圣诞树python 使用turtle 画樱花(python3验证ok)win10系统的计算机C盘在哪,c盘users在哪(win10c盘找不到users)计算机发展史上最著名的两位鼻祖HDFS主要组件(数据块、NameNode、DataNode、secondaryNameNode)python 指定时间运行代码