1.基本结构
typedef struct Lnode//基本结构
{
Elemtype data;
struct Lnode *next;
}Lnode, *Linklist;
2.构造空表
Status IniList_L(LinkList &L)//构造空表
{
L = neW Lnode;//L = (Linklist) malloc(sizeof(Lnode)); //生成新节点作为头节点
L->next = NULL;//头节点指针域置空
return OK;
}
3.判断链表是否为空
int ListEmpty(LinkList L)//判断链表是否为空
{
if(L->next) return 0;//指针域非空即非空
else return 1;
}
4.销毁单链表
Status DestroyList(Linklist &L)//销毁单链表L
{
Linklist L;
while(L)
{
p = L;//刚开始指向头节点(连着头节点一起销毁),后面是把p后移
L = L->next;
delete p;//free(p) free-malloc delete-new
}
}
5.清空链表
Status ClearList(Linklist &L)//清空链表
{
Lnode *p, *q;//或者linklist p, q;
p = L->next;//首元节点地址 , 头节点不要清空
while(p)//没到表尾
{
q = p->next;//记录下一节点
delete p;
p = q;
}
L->next = NULL;//头节点指针域为空
return OK;
}
6.求链表元素个数
int Listlenth_L(Linklist L)//求L元素个数
{
Linklist p;
P = L->next;
i = 0;
while(p)
{
i++;
p = p->next;
}
return i;
}
7.取链表某一位置(i)数据
Status GetElem_L(Linklist L, int i, Elemtype &e)//获取链表某一位置(i)数据
{
p = L->next; j = 1;//初始化p为首元节点
while(p && j < i)//向后扫描直到p为空 或 p指向第i个元素
{
p = p -> next;
++j;
}
if(!p || j > i) return ERROR;//错误情况判断
e = p -> data;//取第i个元素
return OK;
}
8.找值为e的元素地址 (按值查找)
Lnode *LocateElem_L(Linklist L, Elemtype e)//查找值为e的元素地址 (按值查找)
{
p = L->next;j = 1;
while(p && p->data != e)
p = p->next;
return p;
}
9.查找值为e元素序号(按值查找变式)
int LocateELem_L(LinkList L, Elemtype e)//查找值为e元素序号(按值查找变式)
{
p = L->next;j = 1;//j为序号
while(p && p-> != e)
{
p = p->next;
j ++;
}
if(p) return j;//p不为空表示找到了
else return 0;//没找到
}
10.插入元素
Status Listinsert_L(LinkList &L, int i, Elemtype e)//在L中第i个元素之前插入e
{
p = L, j = 0;
while(p && j < i - 1) //第i - 1 个节点为第i个元素
{
p = p -> next;
j++;
}//用来找第i个元素
if(!p || j > i - 1) return ERROR;//插入位置非法
s = new LNode; s -> data = e;//生成新节点s
s -> next = p -> next;//s插入L (p->next 是原来p的下一节点)
p -> next = s;
}
11.单链表的建立:头插法
void CreatList_H(LinkList&L,int n)
{
L = new LNode//或者c: L = (Linklist)malloc(sizeof(LNode));
L->next = NULL;//建立带头节点的单链表
for(int i=n;i>0;i--)//倒位序插入
{
p=new LNode;//申请空间
cin>>p->data;//数组:p->data = an;//后面是an-1,,,,1
p->next=L->next;//把先插入的空指针放在新节点p的next域(使得空指针一直都在最后)
L->next = p;//每个节点插入前 头节点指针域为0 所以把空插入到p的指针域,
//然后链接新节点与头节点(就是把地址p赋值给头节点的指针域 )使得前后节点连起来
}
}//O(n)
12.单链表的建立:尾插法
void CreatList_R(Linklist&L,int n)
{
L=new Lnode;
L->next=NULL;//构造空链表
r=L;//r是尾指针
for(int i=0;i<n;i++)//正位序
{
p=new Lnode;
cin>>p->data;
p->next=NULL;
r->next=p;//插入到表尾
r=p;//新节点变成新的尾节点
}
} //O(n)
13.链表删除节点
Status ListDelete_L(Linklist&L,int i,ElemType&e)//链表的删除 (p)
{
p=L;j=0;
while(p->next && j<i-1){p=p->next;++j};//找第i个节点,p指向他的前驱
if(!(p->next)||j>i-1) return ERROR;
q=p->next;//临时保存被删节点的地址
p->next=q->next;//更改地址
e=q->data;//保存数据
delete q;//删除空间
return OK;
}
14.线性表合并
遍历Lb,在La查找元素 如果找不到就插到La最后
void union(List &La,List Lb)
{
La_len=ListLenth(La);
Lb_len=ListLenth(Lb);
for(int i=1;i<=Lb_lenth;i++)
{
GetELem(Lb,i,e);//获取链表某一位置(i)数据
if(!LocateElem(La,e)) ListInsert(&La,++La_len,e)//找不到值为e元素序号,补上
}
}//时间复杂度:O(la_len*lb_len)=O(n*n)