一.单链表结点的类型定义:普通结构体变量或者指向结构体的指针变量
typedef int Elemtype;
typedef struct node
{
Elemtype data;
struct node *next;
}LNode,*Linklist;
声明的相对应操作:
LNode *h,*p;//定义一个结点
Linklist h,p;//定义头指针
(*p)表示p所指向的结点
(*p).data<=>p->data表示p指向结点的数据域
(*p).next<=>p->next表示p指向结点的指针域
二.申请一块LNode类型的存储单元的操作,并将其地址赋值给变量p
LNode *p;
p=new LNode;
三.链表的相关操作
(1)初始化:定义工作指针P,链表为带头结点的链表
void printlink(LinkList &L)
{
LNode *p;
p=L->next;
while(p!=NUll)
{
printf("%d\n",L->data);
p=p->next;
}
}
(2)链表的递归遍历操作
//正向输出链表
void out1(Linklist L)
{
if(L)
{
printf("%d\n",L->data);
out1(L->next);
}
}
//逆序输出链表
void out2(Linklist L)
{
if(L)
{
out2(L->next);
printf("%d\n",L->data);
}
}
(3)求链表的长度
//求链表的长度
int linklength(Linklist H)
{
LNode *p;
int j=0;
p=H->next;
while(p!=NULL)
{
j++;
p=p->next;
}
return j;
}
(4)查找表中第i个位置的元素
Linklist touch(Linklist &H,int x)
{
LNode *p;
p=H->next;
int j=0;
while(p!=NUll&&j<x)
{
p=p->next;
j++;
}
if(p==NULL) {printf("无此元素\n");return NULL;}
else return p;
}
(5)查找p的前驱节点
//查找前驱结点
LinkList ListLocate2(LinkList H, LNode *p)
{
LNode *pre;
if(H->next==pre) {printf("此节点为首元结点,无前驱结点\n");return NULL;}
pre=H->next;
while(pre!=NULL&&pre->next!=p)
{
pre=pre->next;
}
if(pre==NULL) {printf("找不到\n");return NULL;}
else return pre;
}
(6)查找p的后继结点
//查找后继结点
Linklist finddata(Linklist H,Elemtype e)
{
LNode *p;
p=H->next;
while(p!=NULL&&p->data!=e)
{
p=p->next;
}
if(p==NULL) {printf("找不到\n");return NULL;}
else if(p->next==NULL) {printf("此结点没有后继节点\n");return NULL;}
else return p->next;
}
(7)插入新结点(在p结点之后插入)
void Insert(LinkList H,LNode *p,int x)
{
LNode *s;
s=new LNode; //创建新结点
s->data=x; //设置新结点的元素值
s->next=p->next;
p->next=s; //插入新结点
}
(8)插入新结点(在p结点之前插入)
void Insert(LinkList H,LNode *p,int x)
{
LNode *pre,*s;
pre=H;
while(pre!=NULL&&pre->next!=x)
pre=pre->next;
if(pre==NULL)
{
printf("无p节点\n");
return ;
}
s->data=x;
s->next=pre->next;
pre->next=s;
}
(9)头插法创建链表:时间复杂度为O(n),可以实现逆序操作
Linklist1 creat()//头插法
{
Linklist L,p;
L=new LNode;
L->next=NULL;
scanf("%d",&x);
while(x!=flag)
{
p=new LNode;
p->data=x;
p->next=L->next;
L->next=p;
scanf("%d",&x);
}
return L;
}
(10)尾插法创建链表,要定义尾指针,时间复杂度为O(n)
Linklist2 creat()
{
Linklist L,p;
L=new LNode;
L->next=NULL;
r=L;
scanf("%d",&x);
while(x!=flag)
{
p=new LNode;
p->data=x;
p->next=r->next;
r->next=p;
r=p;
scanf("%d",&x)
}
return L;
}
(11)合并两个(非递减有序)链表
Linklist Union(Linklist La,Linklist Lb)
{
LNode *pa,*pb,*pc,*Lc;
pa=La->next;pb=Lb->next;
Lc=La;
pc=pa;
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;pb=pb->next;
}
}
if(pa) pc->next=pa;
else pc->next=pb;
delete Lb;
return Lc;
}