头文件:
#include<stdio.h>
#include<stdlib.h>
定义
typedef struct LNode
{
int data;
struct LNode *next;
}LNode, *LinkList;
初始化单链表
bool InitList(LinkList &L)
{
L = (LinkList)malloc(sizeof(LNode));
if(L == NULL)return false;
L->next = NULL;
}
bool ListEmpty(LinkList L)
{
if(L->next != NULL)
return true;
else
return false;
}
单链表判空
bool ListEmpty(LinkList L)
{
if(L->next != NULL)
return true;
else
return false;
}
构造单链表—头插法,逆序建表
void CreateList_head(LinkList &L, int n)//头插法,逆序建表
{
LNode *p;
printf("头插法逆序建立单链表 输入%d个元素:", n);
for(int i = n; i > 0; i --)
{
p = (LinkList)malloc(sizeof(LNode));
scanf("%d", &p->data);
p->next = L->next;
L->next = p;
}
}
构造单链表—尾插法,正序建表
void CreateList_tail(LinkList &L, int n)//尾插法,正序建表
{
LNode *p;
LNode *r = L;
printf("尾插法正序建立单链表 输入%d个元素:", n);
for(int i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(LNode));//生成新结点
scanf("%d", &p->data);
r->next = p;
r = p;
}
r->next = NULL;
}
单链表中插入元素
bool ListInsert(LinkList &L, int i, int e)
{
int j;
LNode *p, *s;
p = L;
j = 0;
while(p && j < i - 1)
{
p = p->next;
j++;
}
if(!p || j > i - 1)//属于什么情况---i小于1或者大于表长加一
return false;
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p ->next;
p->next = s;
return true;
}
单链表中删除元素
bool ListDelete(LinkList &L, int i, int &e)
{
LNode *p, *q;
int j;
p = L;
j = 0;
while(p->next && j < i - 1)
{
p = p->next;
j ++;
}
if(!(p->next) || j > i - 1)return false;//删除位置不合理
q = p->next;
p->next = q->next;
e = q->data;
free(q);
return true;
}
求单链表的长度
int ListLength(LinkList L)
{
LNode *p;
int length = 0;
p = L->next;
while(p)
{
length++;
p = p->next;
}
return length;
}
单链表按序查找
bool GetElem(LinkList L, int i, int &e)
{
LNode *p;
p = L->next;
int j = 1;
while(p && j < i)
{
p = p->next;
j++;
}
if(!p || j > i)
return false;
e = p->data;
return true;
}
单链表按值查找
bool GetElem_value(LinkList L, int e, int &pos)//按值查找
{
LNode *p;
p = L->next;
pos = 1;
while(p != NULL && p->data != e)
{
p = p->next;
pos ++;
}
if(p == NULL)
return false;
}
找出指定元素的前驱
若cur_e是L 的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无意义
bool PriorElem(LinkList L, int cur_e, int &pre_e)
{
LNode *pre = L;
LNode *p = L->next;
if(p->data == cur_e)//cur_e是L的第一个数据元素
return false;
else
{
pre = p;
p = p->next;//pre永远指向p的前一个结点
}
while(p && p->data != cur_e)
{
pre =p;
p = p->next;
}
if(p)
{
pre_e = pre->data;
return true;
}
else
return false;//cur_e不是L 的数据元素
}
找出指定元素的后继
若cur_e是L 的数据元素,且不是最后一个,则用nxt_e返回它的后继,否则操作失败,nxt_e无意义
bool NextElem(LinkList L,int cur_e,int &nxt_e)
{
LNode *p = L->next;
LNode *q;
while(p->next)
{
q=p->next;//q永远指向p的下一位置
if(p->data==cur_e)
{
nxt_e=q->data;
return true;
}
p=q;
}
return false;
}
输出单链表
void Print(LinkList L)
{
LNode *p = L->next;
while(p)
{
printf("%d ", p->data);
p = p->next;
}
}
清空单链表
void ClearList(LinkList &L)
{
LNode *p = L->next;
LNode *q;
while(p)
{
q = p->next;
free(p);
p = q;
}
L->next = NULL;
}
销毁单链表
void DestroyList(LinkList &L)
{
LNode *p;
while(L)
{
p = L->next;
free(L);
L = p;
}
}