数据结构,一堆数据的存放方式。
今天我们学习数据结构中的 链表:
链表的结构:
链表是一种特殊的数组,它的每个元素称为节点,每个节点包括两个部分:
- 数据域:存放数据,此部分与数组相同
- 指针域:存放了下一个节点的地址(单向链表)、存放上一个和下一个节点的地址(双向链表)
链表比数组多了指针域,因为链表结构是通过上一个节点的指针域去找下一个数据,比如有一个链表ABCD四个节点,其中A节点是链表的第一个节点,如果我们要访问D节点里边的数据。操作如下:
- 先通过A节点的指针域找到B节点
- 再通过B节点的指针域找到C节点
- 再通过C节点的指针域找到D节点
- 获取D节点数据域的数据
对比数组直接通过下标访问如x=Array[3],链表的访问方式相当麻烦,既然这么麻烦,为什么还有链表这种数据结构呢?因为链表插入删除节点方式十分便捷,在数据量大的时候,删除数组的数据需要把删除数据后面的数据都前移一位,而链表只需要改变前一个元素的指针域,插入和删除操作速度快。
这么厉害的东西,还是看程序比较直接
1、C语言
1.1、程序清单
本程序包含3个文件
它们分别是:
(此处插入图)
linkList.h:
#ifndef _LINKLIST_H #define _LINKLIST_H typedef int Elem; typedef unsigned char uint8_t; struct LkNode { Elem m_eData; struct LkNode *m_iNext; }; struct LinkList { struct LkNode *m_stListHead; int m_iLength; int m_iSize; }; uint8_t LinkListCreate(struct LinkList *list,int size); uint8_t LinkListDeleteAll(struct LinkList *list); uint8_t IsLinkListEmpty(struct LinkList *list); uint8_t IsLinkListFull(struct LinkList *list); int GetLinkListLength(struct LinkList *list); int GetLinkListElemIndex(struct LinkList *list,Elem elem); uint8_t GetListElem(struct LinkList *list,int index,Elem *elem); //uint8_t GetLinkListPrevious(int index,Elem* elem); //uint8_t GetLinkListNext(int index,Elem* elem); uint8_t LinkListInsert(struct LinkList *list,int index,Elem elem); uint8_t LinkListInsertHead(struct LinkList *list,Elem elem); uint8_t LinkListInsertTail(struct LinkList *list,Elem elem); uint8_t LinkListDelete(struct LinkList *list,int index,Elem *getElem); void LinkListPrintAll(struct LinkList *list); #endif