单链表
定义
- 线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素。
- 利用单链表可以解决顺序表需要打量连续存储单元的缺点,但单链表附加指针域,也存在浪费存储空间的缺点。
特点
- 表中元素得逻辑顺序与其物理顺序相同。
- 随机存储。
- 存储密度高,每个节点只存储数据元素。
- 插入和删除需要移动大量元素。
基本操作
初始化
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
采用头插法建立单链表
LinkList List_HeadInsert(LinkList &L) {
LNode *s;
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
scanf("%d", &x);
while(x != 9999) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d", &x);
}
return L;
}
采用尾插法建立单链表
LinkList List_TailInsert(LinkList &L) {
int x;
L = (LinkList)malloc(sizeof(LNode));
LNode *s, *r = L;
scanf("%d", &x);
while(x != 9999) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d", &x);
}
return L;
}
按序号查找节点
LNode *GetElem(LinkList L, int i) {
if (i < 1) return NULL;
int j = 1;
LNode *p = L->next;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
按值查找表节点
LNode *LocateElem(LinkList L, ElemType e) {
LNode *p = L->next;
while (p != NULL && p->data != e)
p = p->next;
return p;
}
插入节点操作
p = GetElem(L, i - 1);
s->next = p->next;
p->next = s;
对某一个节点进行前差操作
p = GetElem(L, i - 1);
s->next = p->next;
p->next = s;
//交换数据域
temp = p->data;
p->data = s->data;
s->data = temp;
删除节点操作
p = GetElem(L, i - 1);
q = p->next;
p->next = q->next;
free(q);
双链表
定义
typedef struct DNode {
ElemType data;
struct DNode *prior, *next;
} DNode, *DLinkList;
双链表的插入操作
s->next = p->next;
p->next->prior = s;
s->prior = p;
p->next = s;
双链表的删除操作
p->next = q->next;
q.next->prior = p;
free(q);
循环单链表
- 循环单链表和单链表的区别在于,表中最后一个节点的指针不是NULL,而改为指向头节点。
- 在循环单链表中,表尾节点*r的next域指向L,故表中没有指针域尾NULL的节点,因此判空条件为头节点的指针是否等于头指针。
循环双链表
- 头节点的prior指针还要指向表尾结点。
- 当循环双链表为空表时,其头结点的prior域和next域都等于L。