C语言实现链表的创建

链表:是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

从链表的概念中不难得出,链表是由一系列结点组成的。
结点又包含有数据域和指针域,数据域存储数据元素,指针域则用来指向别的结点或者存储下一个结点地址,起到链接作用。


一.从百度百科的这副图片来简单理解一下链表的结构

C语言实现链表创建_结点

1.创建头结点head
2.在创建一个结点用来保存每次插入的结点p1
3.循环创建一般结点p2、p3…
4.将创建的结点与已有的结点链接起来
5.遍历链表并输出数据
注意! 我们需要使用malloc函数给结点分配内存,malloc用完最好free,防止造成内存泄漏

  • 链表的优点:灵活性。插入和删除操作时,只需修改被删节点上一节点的链接地址,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点。
  • 链表的缺点: 随机访问。链表的访问取决于结点的位置,当需要随机访问结点时,在顺序存储结构中的效率低。

二.链表的相关操作

1.创建链表(前插法、尾插法、序插法、定位法)

  • 前插法:将新生成的结点依次插入头结点之后创建链表。
  • 尾插法:将新生成的结点依次插入到链表的最后面,作为新链表的最后一个结点。
  • 序插法:将新生成的结点依次插入后保证结点域数据的有序性。
  • 定位法:新生成的结点依次插入到链表中指定的位置中。

2.遍历链表:就是对于某一个数据结构中所有元素按照一定的顺序依次访问。对链表来说,就是从链表的头结点一直访问到链表的尾结点。

3.清空链表:把所有存有数据的结点清空释放出去(除了头结点以外)。

4.销毁链表: 把链表的东西全部清空,就不存在这个链表了,把包括头结点在内的所有节点释放掉。

5.链表逆序:把每一个节点指向的下一个节点的next的指针倒过来进而指向它的前面的那个节点。

三、代码示例

  • 我用尾插法来展示我对链表的理解,尾插法也是最容易理解的。
/*尾插法建立链表*/
 #include <stdio.h>
 #include <stdlib.h>
  
 struct list     //创建链表的结构体
 {
     int    data;                //创建数据域
     struct list *next;          //创建指针域
 };
 
 int main(int argc,char *argv[])
 {
     int n;                      //设置结点的个数
     int i;                      //设置创建的结点的个数
     struct list *head = (struct list *)malloc(sizeof(struct list));//创建头结点用malloc分配内存
     head->next = NULL;          //头结点指针初始化
     struct list *p;             //创建p结点,p结点用于记录链表尾结点
     p = head;                   //p结点指针赋值为头结点
     printf("从键盘输入链表长度是:\n");                                                                                                                                 
     scanf("%d",&n);
     printf("输入数据为:\n");
              
     /* 链表的创建*/ 
     for(i=0;i<n;i++)            //循环创建结点
     {   
         struct list *p1=(struct list *)malloc(sizeof(struct list)); //创建p1结点,并分配内存
         scanf("%d",&p1->data);  //给p1结点赋值
         p->next = p1;           
         p1->next = NULL;        //让插在尾部的p1结点的指针指向NULL
         p = p1;
     }
 
      /*链表的遍历*/
     p = head;                   //从头结点开始遍历
     while(p->next != NULL)      //只要p结点下一个结点不为空,证明还有结点存在,打印p后面结点的数据
     {
         printf("%d",p->next->data);
         p = p->next;            //p结点移动到下一个结点
     }
     printf("\n");
 
     /*清空链表*/
     p=head->next;               //让p结点指向头结点下一位
     while(head->next!=NULL)     //当头结点下一位一直不为空时
     {
         head->next=p;           //将头结点下一位赋予p
         p=p->next;              //新的p结点=头结点下一位的下一位 直到尾结点=头结点
         free(head->next);
         head->next=NULL;        //确保头结点下一位为空
     }
     printf("clean the list sucessfuly!\n");
     return 0;
 }

运行得到结果显示如下:

C语言实现链表创建_c语言_02