1.1 定义(主要针对单链表)
单链表中的结点可定义为
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
1.2 单链表的建立
可以采用两种方式建立单链表。
1.2.1 头插法建立单链表
LinkList CreateList1(LinkList &L)
{
LNode *s; int x;
L = (LinkList)malloc(sizeof(LNode));
L-next = NULL;
scanf("%d",&x);
while(x != 9999)
{
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = L-next;
L-next = s;
scanf("%d",&x);
}
return L;
}
1.2.2 尾插法建立单链表
LinkList CreateList2(LinkList &L)
{
int x;
L = (LinkList)malloc(sizeof(LNode));
LNode *s, *r = L;
scanf("%d",&x);
while(x != 9999)
{
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d",&x);
}
r->next = NULL;
return L;
}
1.3 典型例题
设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点。
采用递归实现;
终止条件:f(L,x) = 不做任何事情; 若L为空表 递归主体 : f(L,x) =删除*L结点;f(L->next,x); 若L->data == x f(L,x) = f(L->next,x); 其他情况
代码如下:
void Del_X_3(Linklist &L, Elemtype x) { LNode* p; if(L == NULL) return; if(L->data == x) { p = L; L = L->next; free(p); Del_X_3(L,x); } else Del_X_3(L->next,x); }
在带头结点的单链表L中,删除所有值为x(或者x在某一区间,只需修改if条件即可)的结点,并释放空间,假设值为x的结点不唯一。
代码如下: void Del_X_1(LinkList &L, ElemType x) { LNode* p = L->next, *pre = L, *q; while(p !=NULL) { if(p->data == x) { q = p; pre->next = p->next; p = p->next; free(q); } else { pre = p; p = p->next; } } }
也可采用尾插法实现,代码如下:
void Del_X_2(LinkList &L, ElemType x)
{
LNode* p = L->next, *r = L, *q;
while(p !=NULL)
{
if(p->data != x)
{
r->next = p;
r = p;
p = p->next;
}
else
{
q = p;
p = p->next;
free(q);
}
}
}
3.单链表就地逆置
代码如下:
LinkList reverse(LinkList L)
{
LNode *pre,*p = L->next,*r = p->next;
p->next = NULL;
while(r != NULL)
{
pre = p;
p = r;
p->next = pre;
r = r->next;
}
L-next = p;
return L;
}
4 带头结点的单链表递增有序
代码如下:
void sort(LinkList &L)
{
LNode *p = L->next,*pre;
LNode *r = p->next;
p-next = NULL;
while(p != NULL)
{
r = p->next;
pre = L;
while(pre->next != NULL && pre-next->data < p->data)
pre = pre-next;
p->next = pre->next;
pre->next = p;
p = r;
}
}
5 合并两个递增有序的链表
void MergeList(LinkList &La, LinkList &Lb)
{
LNode *r,*pa = La->next, *pb = Lb->next;
La->next = NULL;
while(pa && pb)
{
if(pa->data <= pb->data)
{
r = pa->next;
La->next = pa;
La = pa;
pa = r;
}
else
{
r = pb->next;
La->next = pb;
La = pb;
pb = r;
}
if(pa)
pb = pa;
while(pb)
{
r = pb->next;
La->next = pb;
La = pb;
pb = r;
}
La->next = NULL;
free(Lb);
}
}
参考:王道考研系列-数据结构联考复习指导 2017。