链表及其应用(C语言实现)
-
前言
顺序表由于是顺序存储的,所以其优点就是访问元素的效率及其高,但是对元素的删除插入操作效率却很低,因为为了保持其顺序存储的特性在插入删除的过程中可能需要大量的搬移元素。为了解决这个问题,人们设计了另一种数据结构----链表。 -
链表定义
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
----来源于百度百科这是百度百科给出的定义,其实简单来说就是:最简单的链表由两部分组成,数据和指针,指针指向下一个元素的地址。打个比方,假设有十个人住进了酒店的十个房间,这每个房间就是一个节点,人表示数据,房间号就是地址。第一个人手里有第二个人的房间号,第二个人手里面有第三个人的房间号…以此类推。到了最后一个人由于没有下一个人了,所以他手里没有任何人的房间号,这就是在链表里面最后一个节点的指针域是空。当然这也不是一定的,对于循环链表,最后一个人手里有第一个人的房间号。只不过,这样就不存在第一个人和最后一个人的概念了。对于第一个节点也有不同的理解,有的人认为,第一个节点不放数据,只放第一个节点的地址。我们可以把第一个节点理解为酒店的前台,前台只知道第一个人的房间号(当然只是假设,现实中并不这样)。
-
链表的查询
想象一下如果我们要找一个人该怎么做呢?没错,你可能已经想到了,就是挨个问。首先找到第一个人,看是不是要找的那个人,如果是,那就是他了,如果不是那就问第一个人,你知道xxx住哪件房吗?他会回答我不知道xxx在哪里,不过你可以去xxx号房间看看,于是你就去他说的那个房间,然后重复第一个人的情况。是不是觉得很麻烦?没错,链表查找元素的过程就是这样麻烦。
1.查找第i个节点
1/*查找第i个节点*/
2ListNode *Get(LinkList &head,int i)
3{
4 Node *p;
5 int j;
6 if(ListEmpty(head)) /*如果链表为空*/
7 return NULL; /*返回NULL*/
8 if(i<1) /*如果序号不合法*/
9 return NULL; /*则返回NULL*/
10 j=0;
11 p=head;
12 while(p->next!=NULL&&j<i)
13 {
14 p=p->next;
15 j++;
16 }
17 if(j==i) /*找到第i个结点*/
18 return p; /*返回指针p*/
19 else /*否则*/
20 return NULL; /*返回NULL*/
21}
2.查找节点位置
1/*查找节点位置*/
2int LocatePos(LinkList &head,DataType e)
3 {
4 Node *p;
5 int i;
6 if(ListEmpty(head)) /*在查找第i个元素之前,判断链表是否为空*/
7 return 0;
8 p=head->next; /*指针p指向第一个结点*/
9 i=1;
10 while(p)
11 {
12 if(p->data==e) /*找到与e相等的元素*/
13 return i; /*返回该序号*/
14 else
1