目录
一、定义
#define ElemType int
typedef struct LNode { //带头结点的单链表
ElemType data;
struct LNode *next;
}LNode,*LinkList;
二、初始化
(带头节点)
bool InitList(LinkList &L) {
L = (LNode*)malloc(sizeof(LNode)); //分配一个头结点
if (L == NULL)
return false;
L->next = NULL;
return true;
}
(不带头节点)
bool Initlist(list &L)
{
L = NULL;
return true;
}
注:
- 不带头节点的单链表的定义中,list 等同于LiskList , node 等同于 LNode
三、头插法建立单链表
(带头节点)
void List_HeadInsert(LinkList &L)
{
ElemType x;
LNode *s;
cout << "请输入数据:";
cin >> x;
while(x!=9999)
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
cin >> x;
}
}
(不带头节点)
void list_HeadInsert(list &L)
{
ElemType x;
cout << "请输入数据:";
cin >> x;
while(x!=9999)
{
node *s;
s = (node *)malloc(sizeof(node));
s->data = x;
s->next = L;
L = s;
cin >> x;
}
}
四、尾插法建立单链表
(带头节点)
void List_TailInsert(LinkList &L)
{
ElemType x;
LNode *s, *r = L;
cout << "请输入数据:";
cin >> x;
while(x!=9999)
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
cin >> x;
}
r->next = NULL;
}
(不带头结点)
void list_TailInsert(list &L)
{
ElemType x;
node *r = L;
cout << "请输入数据:";
cin >> x;
while(x!=9999)
{
node *s = (node *)malloc(sizeof(node));
s->data = x;
s->next = NULL;
if(L==NULL)
{
L = s;
r = L;
}
else
{
r->next = s;
r = s;
}
cin >> x;
}
}
五、按序号查找结点值
(带头节点)——GetElem()
LNode* GetElem(LinkList L, int i)
{
int j = 1;
LNode* p = L->next;
if (i == 0) //如果 i=0, 返回头结点
return L;
if (i < 1) //如果 i 无效,返回NULL
return NULL;
while (p && j < i)
{
p = p->next;
j++;
}
return p; //返回第 i 个节点的指针,若 i 大于表长,则返回NULL
}
六、插入操作
已知待插入的结点 s ,插入的位置为 i ,则插入操作为
p = GetElem(L, i - 1); //查找插入位置的前驱节点
s->next = p->next;
p->next = s;
注:
- 若无法得到 s 的前驱节点,只能得到 s 的后继结点 p,插入的思想为:仍将 s 插入到 p 之后,然后将二者的data信息互换。
七、删除操作
将单链表第 i 个结点删除 ,则删除操作为
p = GetElem(L, i - 1); //查找删除位置的前驱节点
q = p->next;
p->next = q->next;
free(q);
注:
- 若无法得到第 i 个结点的前驱节点,只是知道了它本身,则删除的基本思想为:仍将它本身看为是一个前驱节点,让它本身的 data 等于后面的结点的 data,然后删除它本身后面的结点。