#一、链式存储结构
<1>用一组任意的存储单元存储线性表中的数据元素
<2>这组存储单元可以是连续的,也可以是不连续的
<3>每个数据元素除了存储数据元素外,还要存储前驱,后继元素的地址
data 数据域 | address 指针域 |
二、单链表
2.1、
<1>结点:链式存储结构中的一个数据元素
<2>每一个结点的指针域仅包含一个后继指针
<3>n个结点按链式存储结构存储(最后一个结点不存在后继结点,用^来表示)
2.2.1、初始化
#include <stdio.h>
typedef int DataType;
typedef struct LinklistNode{
DataType data;
struct LinkListNode *next;
}LinkListNode;
typedef struct LinkList{
LinkListNode *head;
int length;
}LinkList;
void initLinkList(LinkList *list)
{
list -> head = NULL;
list -> length = 0;
}
int main(int argc, const char *argv[])
{
LinkList ll;
initLinkList(&ll);
return 0;
}
2.2.2、插入一个结点
void insertLinkList(LinkList *list,int pos,DataType *x)
{
int i;
LinkListNode *node,*p,*r;
if(pos < 0)
pos = 0;
if(pos > list->length)
pos = list->length;
node = (LinkListNode *)malloc(sizeof(LinkListNode));
if(node == NULL)
return LIST_OUT_OF_MEMERY;
node->data = *x;
node->next = NULL;
list->length++;
if(pos == 0)
{
node->next = list->head;
list->head = node;
return LIST_OPERATION_SUCCESS;
}
p = list->head;
for(i = 1;i < pos;i++)
{
p = p->next;
}
r = p->next;
node->next = r;
p->next =node;
return LIST_OPERATION_SUCCESS;
}
2.2.3、获取线性表中元素的个数
int getLinkListLength(LinkList *list)
{
return list->length;
}
2.2.4、判断表是否为空
void isLinkListEmpty(LinkList *list)
{
return list->head == NULL ? LIST_EMPTY : LIST_NOT_EMPTY;
}
2.2.5、指定位置删除一个数
void deleteLinkList(LinkList *list,int pos)
{
int i;
LinkListNode *p,*q;
if(isLinkListEmpty(list) == LIST_EMPTY)
return LIST_EMPTY;
if(pos < 0 || pos > list->length)
return LIST_INDEX_ERROR;
list->length--;
p = list->head;
if(pos == 0)
list->head = list->head->next;
else
{
for(i =0;i < pos - 1;i++)
{
p = p->next;
}
q = p->next;
p->next = q->next;
p = q;
}
free(p);
return LIST_OPERATION_SUCCESS;
}
2.2.6、清除单链表中所有元素
void clearLinkList(LinkList *list)
{
while(list->head)
deleteLinkList(list,0);
}