线性表的链式存储结构:
为了表示数据元素ai和其后继元素ai+1之间的逻辑关系,对ai来说需存储其本身信息和后继元素的信息(存储位置)。这两部分组成ai的存储映像,称为结点(Node),它包含两个域:数据域和指针域。n个结点链结在一起,就组成线性表的链式存储结构。
我们首先来看一下最简单也是最常用的单链表。前面我们已经了解到,链表中我们把每个内存块叫做链表的一个结点。为了将每个结点连接到一起,每个结点不仅存储数据,而且还需要记录下一个结点的地址。我们把这个记录下一个结点的指针称为后继指针next。单链表是单方向顺序的一个线性表。其中有两个结点比较特殊,分别是第一个和最后一个结点。我们通常把第一个结点叫做头结点,最后一个结点叫做尾结点,头结点用来记录链表的基地址,这样我们就可以遍历得到整个结点,尾结点是最后一个结点,它的指针指向一个空地址NULL,这样我们通过判断后继指针next是不是NULL来确定某个结点是不是尾结点。
1)单向链表
using namespace std;
struct Node
{
int value;
Node *next;
}*LinkedList,LNode;
接下来我们来看下双向链表,单链表只有一个指针,每个结点都只有一个后继指针next指向下一个结点的地址。而双向链表,顾名思义,它有两个方向,所以每个结点不仅有一个指向下一个结点的后继指针next,还有一个指向前一个结点的前驱结点prev。与单链表相比,双向链表的每个结点还需要存储指向前一个结点的指针,所以,同样多的数据,双向链表比单链表需要更多的存储空间。两个指针虽然比较浪费空间,但是双向链表可以双向遍历,灵活性更高。
2)双向链表
struct DNode
{
int value; /* Data field */
struct DNode *prior; /* Pointer field */
struct DNode *next; /* Pointer field */
}DNode;
一、单向链表的ADT定义
1.1 创建链表
使用尾插法创建单链表
//尾插法创建单链表、链表长度为n;
void CreatLinkedList(LinkedList &L,int n)
{
L = (LinkedList)malloc(sizeof(LNode)); //初始化;
L->next = NULL;
L->data = 0;
LinkedList Tail = L; //尾指针;
cout<<"Enter "<<n<<" number(s)"<<endl;
for(int i = 0 ; i < n; i++)
{
LinkedList Temp = (LinkedList)malloc(sizeof(</