《啊哈!算法》第四章---链表
本节讲的很简单,通俗易懂,适合零基础或基础薄弱的初学者入门,废话少说,以下是自己做的笔记。
一、什么是链表
诸如以下形式
称为单链表(有了单链表,肯定就有双链表,循环链表之类的啦)
接下来需要往链表中插入6,操作如下:
二、针对上面例子详细代码解释如下
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 //这里创建一个结构体用来表示链表的结点类型 5 typedef struct node 6 { 7 int data; 8 struct node *next; 9 }List; 10 int main() 11 { 12 List *head,*p,*q,*t; 13 int i,n,a; 14 scanf("%d",&n); 15 head = NULL;//头指针初始为空 16 for(i=1;i<=n;i++)//循环读入n个数 17 { 18 scanf("%d",&a); 19 //动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点 20 p=(List *)malloc(sizeof(List)); 21 p->data=a;//将数据存储到当前结点的data域中 22 p->next=NULL;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空 23 if(head==NULL) 24 head=p;//如果这是第一个创建的结点,则将头指针指向这个结点 25 else 26 q->next=p;//如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点 27 q=p;//指针q也指向当前结点 28 } 29 printf("请输入待插入的数字:"); 30 scanf("%d",&a);//读入待插入的数 31 t=head;//从链表头部开始遍历 32 while(t!=NULL)//当没有到达链表尾部的时候循环 33 { 34 if(t->next->data > a)//如果当前结点下一个结点的值大于待插入数,将数插入到中间 35 { 36 p=(List *)malloc(sizeof(List));//动态申请一个空间,用来存放新增结点 37 p->data=a; 38 p->next=t->next;//新增结点的后继指针指向当前结点的后继指针所指向的结点 39 t->next=p;//当前结点的后继指针指向新增结点 40 break;//插入完毕退出循环 41 } 42 t=t->next;//继续下一个结点 43 } 44 //输出链表中的所有数 45 t=head; 46 while(t!=NULL) 47 { 48 printf("%d ",t->data); 49 t=t->next;//继续下一个结点 50 } 51 printf(" "); 52 // 释放指针(free释放掉指定参数指针指向的内存,并返回void) 53 free(head); 54 free(p); 55 free(q); 56 free(t); 57 58 return 0; 59 }
注:此节还提到了free()函数用来释放内存空间,安全起见需要在合适的位置适当时候释放空间 具体关于free()函数的讲解参考博客:
https://blog.csdn.net/Leisure512/article/details/4978476
https://blog.csdn.net/henulwj/article/details/8234365