初探链表

《啊哈!算法》第四章---链表

本节讲的很简单,通俗易懂,适合零基础或基础薄弱的初学者入门,废话少说,以下是自己做的笔记。

一、什么是链表

诸如以下形式

称为单链表(有了单链表,肯定就有双链表,循环链表之类的啦)

接下来需要往链表中插入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

原文地址:https://www.cnblogs.com/guohaoblog/p/9231966.html