链表的定义
链表是一种动态的数据结构,其中所有数据元素(data elements)彼此链接。链表是节点的集合,每个节点包含两部分数据(data)部分和地址(address)部分。
链表的优点
动态数据结构:链表是种动态数据结构,在程序执行期间可以随意增加或减少节点。
没有内存浪费:链表是在程序执行时,主动分配内存的因此不存在内存浪费问题。
可任意插入和删除数据:在链表中,可以指定删除和添加任意一个节点。
单链表
单链表的结构定义如下:
/*单链表的结构*/
typedef struct node
{
int data;
struct node *next;
}Node,*LinkList;
单链表增添、删除、查找等功能的实现:由于单链表是一种线性表,所以可以通过指针域的遍历来完成对数据对象的操作。
/*初始化单链表*/
LinkList NewLinkList()
{
LinkList head;
head = (LinkList)malloc(sizeof(Node));//为第一个元素分配内存空间
head->data = 0;
head->next = NULL;
return head;
}
/*获取单链表的长度*/
int Length(LinkList head)
{
LinkList p=head;
int cnt = 1;
while (p->next)//循环查找
{
p = p->next;
cnt++;
}
return cnt;
}
/*获取指定位置的单链表*/
LinkList GetLinkList(LinkList head, int i)
{
LinkList p = head;
int cnt = 0;
while (p&&cnt<i)
{
p = p->next;
cnt++;
}
if (cnt != i) return NULL;
return p;
}
bool Insert(LinkList head, int data, int i)
{
LinkList p, q;
p = GetLinkList(head, i - 1);//查找该第i个位置的节点
if (!p) return false;
q = (LinkList)malloc(sizeof(Node)); q->data = data;//为新节点分配内存空间,给元素赋值
q->next = p->next; p->next = q;//重新生成链域
return true;
}
bool RemoveAt(LinkList head, int i)
{
LinkList p,q;
p = GetLinkList(head, i - 1);//查找该第i个位置的节点
if (!p || !p->next) return false;
q = p->next;p->next = q->next;//重新生成链
free(q);//释放该节点的空间
return true;
}
循环链表
我们将单链表的尾指针指向起始节点,那么所有的节点将会形成一个环形结构,我们将之称为循环链表(Circular Linked List)。
双向链表
我们将单链表的节点中再添加一个指针指向前一个节点,那么就形成了一个可以前后节点相互访问的链表,我们将之称为双向链表(Doubly Linked List)。
双向表的结构定义如下:
/*双向链表的结构*/
typedef struct dnode
{
int data;
struct dnode *prior,*next;
}DNode, *DLinkList;