Skip to content

Latest commit

 

History

History
170 lines (163 loc) · 6.69 KB

File metadata and controls

170 lines (163 loc) · 6.69 KB

一起talk C栗子吧(第十二回:C语言实例--单链表一)

各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例。闲话休提, 言归正转。让我们一起talk C栗子吧!

看官们,上一回中咱们没有说具体的例子,而且是说了例子中的文件组织结构。这一回咱们继续说C例子, 说的例子是链表,更准确的说法叫作单链表。咱们不但要说C例子,而且会在例子中使用上一回中说过的 文件组织结构,就当作是举例说明文件组织结构的使用方法。 有点一石二鸟的感觉,哈哈。

链表定义:看官们,所谓的链表其实就是一组元素通过一定的方式链接在一起。比如我们坐的火车和地铁, 就是把一节节的车厢链接在一起才形成了一个火车或者地铁。在软件开发中常用的链表有单链表,双向链 表和循环链表。今天,我们主要说的是单链表,其它类型的链表在后面的章回中依次介绍。

链表实现:单链表有两种实现方法,一种是线性存储,一种是链式存储。这么说,大家可能可能觉得有点 抽象,不容易理解。没关系,咱们用举个生活中的例子说明。线性存储可以看作元素一个接一个的排列在 一起,我们日常生活中的排队就可以看作是线性存储,队列中的每个人看作是链表中的元素,排队时每个 人都是一个跟着一个,生怕中间有个空间被其它人插队,这种一个跟着一个的方式可以看作是线性存储。 在写程序的时候,使用数组来表示单链表的线性存储。数组中的元素大小相同,而且各个元素依次排列在 一起,通过数组下标可以访问数组中的元素。链式存储可以看作元素通过一条链连接在一起,我们日常生 活中马路上的车队可以看作是链式存储。每当上下班高峰的时候,马路上的车辆都是一个接一个地在马路 上缓慢行走,远远望去就是一条汽车链。每辆汽车可以看作链表中的元素,而这条汽车链就是通过马路连 接在一起的。当然了,这些汽车里有一些公交车,它们会在路边公交车站临时停车,供乘客上下车。但是 不会影响其它汽车在马路上行走。我们把公交车停在公交车站的当作从汽车链中删除一个元素。当公交车 离开公交车站回到马路上时,可以看作是向汽车链中插入一个元素。看官们能感觉到公交车在公交车站的 停靠,对汽车链的影响非常小。这也体现了单链表的好处,删除或者插入元素很方便。哈哈,把日常生活 中的东西和链表这个抽象的概念结合起来,是不是感觉理解容易了呢?

看官们,关于的单链表的例子,详细的代码如下,大家可以参考。在例子中能看到:通过数组来实现单链 表的顺序储存方式,同时提供了单链表常用的功能:遍历链表,插入和删除元素,查找元素。

    1	/* **************************
    2	 * Head file of Single List
    3	 * *************************/
    4	#ifndef SINGLE_LIST_H
    5	#define SINGLE_LIST_H
    6	
    7	#include<stdio.h>
    8	
    9	#define SIZE 10
   10	
   11	typedef int LIST; //把int当作List类型,实际中可以使用其它的类型或者自己定义一个List类型,不过不能是使用struct复合类型
   12	
   13	int ListSize = 0;  //定义List的实际长度,它不能比SIZE大,因为实际只有SIZE个空间
   14	
   15	//声明函数原型,这里有插入,删除,查找链表元素的函数,以及遍历链表的函数
   16	int ListInsert(LIST *list,LIST a);
   17	int ListDelete(LIST *list,LIST a);
   18	int ListTravel(LIST *list);
   19	int ListFindElement(LIST *list,LIST a);
   20	
   21	#endif /*SINGLE_LIST_H*/
    1	/* **************************
    2	 * Source file of Single List
    3	 * *************************/
    4	#include"Ex010_SingleList.h"
    5	
    6	//函数的实现,和主函数放到了一个源文件中,实际中最好不要放在一起
    7	int ListTravel(LIST *list)
    8	{
    9		int index =0;
   10	
   11		if(NULL == list)
   12			return 1;
   13	
   14		for(index=0; index<ListSize && index < SIZE; ++index)
   15			printf("%d ",list[index]);
   16	
   17		printf("\n");
   18	
   19		return 0;
   20	}
   21	
   22	//查找到元素后返回无数在链表中的位置,即数组的下标,否则返回-1
   23	int ListFindElement(LIST *list,LIST a)
   24	{
   25		int index = 0;
   26	
   27		if(NULL == list)
   28			return -1;
   29	
   30		for(index=0; index<ListSize && index < SIZE; ++index)
   31		{
   32			if(list[index] == a )
   33				return index;
   34		}
   35	
   36		return -1;
   37	}
   38	
   39	int ListInsert(LIST *list,LIST a)
   40	{
   41		if(NULL == list)
   42			return 1;
   43	
   44		if( ListSize >= SIZE)
   45		{
   46			printf("The list is full \n");
   47			return 1;
   48		}
   49	
   50		list[ListSize++] = a; //从List尾部插入元素
   51	
   52		return 0;
   53	}
   54	
   55	int ListDelete(LIST *list,LIST a)
   56	{
   57		int index = 0;
   58	
   59		if(NULL == list)
   60			return 1;
   61	
   62		if( ListSize < 0 )
   63		{
   64			printf("The list is empty\n");
   65			return 1;
   66		}
   67	
   68		index = ListFindElement(list,a);
   69	
   70		if(-1 != index )
   71		{
   72			if(index == SIZE-1) //链表中最后一个元素的时候这样删除
   73			{
   74				list[index] = 0;
   75				ListSize -= 1;
   76				return 0;
   77			}
   78			
   79			index += 1;
   80			while(index <= ListSize )
   81			{
   82				list[index-1] = list[index];
   83				index++;
   84			}
   85			list[index-1] = 0;
   86			ListSize -= 1;
   87		}
   88	
   89		return 0;
   90	}
   91	
   92	//程序主要逻辑部分
   93	int main()
   94	{
   95		int i = 0;
   96		LIST List[SIZE] = {0}; //定义了一个SIZE大小的链表,通过数组实现顺序存储
   97	
   98		for(i=0; i<SIZE; ++i)
   99			ListInsert(List,i+1);
  100	
  101	    ListTravel(List);
  102		ListInsert(List,23); 
           //注意插入的元素类型需要是LIST类型,因为当前的LIST是int类型,所以插入一个数字23
  103		ListDelete(List,10); //删除元素的类型和插入的一样,不多说了
  104		ListTravel(List);
  105		ListDelete(List,5);
  106		ListTravel(List);
  107		ListDelete(List,1);
  108		ListTravel(List);
  109	
  110	
  111		return 0;
  112	}

各位看官,关于单链表的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解。