博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
链表基本操作的实现
阅读量:4993 次
发布时间:2019-06-12

本文共 4901 字,大约阅读时间需要 16 分钟。

 

1 #include 
2 #include
3 #define LEN sizeof(struct student) 4 5 /*----------------数据定义----------------------*/ 6 7 //定义一个学生信息的结构体,包括学号,姓名和结构体类型的指针 8 struct student 9 { 10 long num; //学号 11 char name[128]; //姓名 12 struct student *next; //结构体指针 13 }; 14 15 typedef struct student * stuNode; 16 17 int n=0; //全局变量,记录链表的长度 18 19 /*---------------函数声明---------------------*/ 20 21 stuNode Create(); //创建一个新的链表 22 23 void Print(stuNode head); //通过传入的链表头指针打印整个链表 24 25 stuNode Delete(stuNode head,int num); //通过传入的链表头指针和学生学号删除节点 26 27 stuNode Insert(stuNode head,stuNode newStu); //依照学生学号的顺序向链表中插入新元素 28 29 30 /*---------------函数定义----------------------*/ 31 32 struct student *Create() 33 { 34 struct student *head,*p1,*p2; 35 36 //开辟一个LEN大小的空间,并让p1,p2指针指向它 37 p2=p1=(struct student *)malloc(LEN); 38 //将头指针置为NULL 39 head=NULL; 40 41 //创建链表节点并给节点的元素赋值 42 printf("请输入学生的学号和姓名:"); 43 scanf("%ld %s",&p1->num,p1->name); 44 while(p1->num!=0) 45 { 46 n=n+1; 47 if(NULL==head) 48 { 49 head=p1; 50 } 51 else 52 { 53 p2->next=p1; 54 } 55 p2=p1; 56 p1=(struct student *)malloc(LEN); 57 printf("请输入学生的学号和姓名:"); 58 scanf("%ld %s",&p1->num,p1->name); 59 } 60 //将尾节点的指针置为NULL 61 p2->next=NULL; 62 return head; 63 } 64 65 66 void Print(struct student *head) 67 { 68 struct student * p; 69 p=head; 70 71 //判断链表是否为空 72 if(NULL==head) 73 { 74 printf("链表为空!\n"); 75 return head; 76 } 77 else 78 { 79 //循环打印链表中的元素 80 printf("%d 个记录分别为:\n",n); 81 while(p!=NULL) 82 { 83 printf("%ld %s\n",p->num,p->name); 84 //指针指向下一个节点 85 p=p->next; 86 } 87 } 88 } 89 90 91 struct student *Delete(struct student * head,int num) 92 { 93 struct student *p1; 94 struct student *p2; 95 p1=head; 96 //判断链表是否为空 97 if(NULL==head) 98 { 99 printf("链表为空!\n");100 return head;101 }102 //遍历节点,判断当前节点是不是需要删除的节点及是否为尾节点103 //如果找到相应节点,或者已经遍历到尾节点就跳出循环 104 while(p1->num!=num&&p1->next!=NULL)105 {106 p2=p1;107 p1=p1->next;108 }109 //判断是否找到相应节点 110 if(p1->num==num)111 {112 //要删除的节点是不是链表的第一个节点113 //如果是,就将头指针指向该节点的后一个节点114 //如果不是,就将该节点的前一个节点的指针指向该节点的后一个节点 115 if(head==p1)116 {117 head=p1->next;118 }119 else120 {121 p2->next=p1->next;122 }123 n=n-1;124 printf("%ld 节点已删除.\n",num);125 }126 else127 {128 printf("链表中没有要删除的元素.\n");129 }130 return head;131 }132 133 134 struct student *Insert(struct student * head,struct student * newStu)135 {136 struct student *p0;137 struct student *p1;138 struct student *p2;139 p0=newStu;140 p1=head;141 //判断链表是否为空,如果是空链表,就将新节点作为第一个节点 142 if(NULL==head)143 {144 head=p0;145 p0->next=NULL;146 }147 else148 {149 //遍历每一个节点中的学号,与新学号比较大小150 //如果找到一个学号比新学号大,就将新学号的节点插入它之前 151 //如果尾节点的学号仍比新学号小,就将新节点插入到链表尾部 152 while((p0->num > p1->num)&&(p1->next!=NULL))153 {154 p2=p1;155 p1=p1->next;156 }157 //找到一个比新学号大的节点 158 if(p0->num <= p1->num)159 {160 //判断该节点是否为头节点,如果是,则将新节点设置为头节点 161 if(p1==head)162 {163 head=p0;164 }165 else166 {167 p2->next=p0;168 }169 p0->next=p1;170 }171 else172 {173 p1->next=p0;174 p0->next=NULL;175 }176 }177 //链表长度加1 178 n=n+1;179 printf("%ld 插入成功!\n",newStu->num);180 return head;181 }182 183 void main()184 {185 struct student *head;186 struct student *stu;187 int num;188 head=Create();189 Print(head);190 printf("请输入要删除的学号:");191 scanf("%ld",&num);192 while(num!=0)193 {194 head=Delete(head,num);195 Print(head);196 printf("请输入要删除的学号:");197 scanf("%ld",&num);198 }199 printf("请输入要插入的节点:");200 stu=(struct student *)malloc(LEN);201 scanf("%ld %s",&stu->num,stu->name);202 while(stu->num!=0)203 {204 head=Insert(head,stu);205 printf("请输入要插入的节点:");206 stu=(struct student *)malloc(LEN);207 scanf("%ld %s",&stu->num,stu->name);208 }209 Print(head);210 }

 

mingw5编译通过,链表结构是数据结构中的基础,掌握链表的逻辑,存储结构和基本操作,并能自己用代码实现,将有助于对后续复杂数据结构和算法的学习!

转载于:https://www.cnblogs.com/Alex-bg/archive/2012/08/05/2623946.html

你可能感兴趣的文章
Notification(一个)——使用演示样本的基础知识
查看>>
《算法导论》为什么经典
查看>>
windows如何能在“运行”框输入名称就启动相应的软件
查看>>
修复反编译资源文件及批量修复程序源码
查看>>
CODEVS 1217 借教室
查看>>
VM ware 安装时候的一些坑和解决办法
查看>>
【原】最长上升子序列——动态规划
查看>>
26. Remove Duplicates from Sorted Array
查看>>
RN开发-Navigator
查看>>
innodb二进制文件相关的参数
查看>>
前谷歌高管给初入职场新人的14条忠告
查看>>
01-html介绍和head标签
查看>>
Python之Linux下的 virtualenv
查看>>
ASP.NET Web开发框架之三 报表开发
查看>>
大家好
查看>>
PHP文件上传类
查看>>
Python基础 --- 使用 dict 和 set
查看>>
仿迅雷播放器教程 -- 基于VLC的MFC播放器 (6)
查看>>
Python之数据结构基础
查看>>
WPF:如何高速更新Model中的属性
查看>>