1.定义一个单链表
typedef int ElemType;
typedef struct LNode{ //定义单链表结点类型
ElemType data; //每个结点存放一个数据元素
struct LNode *next; //定义一个next指针指向下一个结点
}LNode,*LinkList; //Lnode==struct Lnode LinkList==LNode*
2.初始化一个空单链表
//初始化一个带头结点的单链表
bool InitList(LinkList &L){
L=(LNode*)malloc(sizeof(LNode));//为头结点分配空间
if(L==NULL)
return false; //内存不足 分配失败
L->next=NULL; //头结点之后无结点 设置为空
return true;
}
3.单链表插入
3.1 按位插入(带头结点)
//在第i个位序插入i
bool ListInsert(LinkList &L,int i,ElemType e){
if(i<1)
return false;//判断i是否合法
LNode *p; //p指向while内扫描到的结点
int j=0; //当前p指向的第j个结点
p=L; //L指向头结点 令P指向头结点
while(p!=NULL&&j<i-1){//遍历链表 找到要存的结点i-1
p=p->next; //p指向下一个结点
j++;
}
if(p==NULL) //遍历到最后没找到
return false;
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=e; //将s结点的data改为e
s->next=p->next; //将s结点的指针指向p的指针指向的下一个结点
p->next=s; //将p的指针指向s
return true;
}
3.2 按位插入(不带头结点)
//在第i个位序插入i(不带带头结点)
bool ListInsert(LinkList &L,int i,ElemType e){
if(i<1)
return false;//判断i是否合法
if(i==1){
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=L;
L=s; //头指针指向新的结点
return true;
}
LNode *p; //p指向while内扫描到的结点
int j=0; //当前p指向的第j个结点
p=L; //L指向头结点 令P指向头结点
while(p!=NULL&&j<i-1){//遍历链表 找到要存的结点i-1
p=p->next; //p指向下一个结点
j++;
}
if(p==NULL) //遍历到最后没找到
return false;
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=e; //将s结点的data改为e
s->next=p->next; //将s结点的指针指向p的指针指向的下一个结点
p->next=s; //将p的指针指向s
return true;
}
3.3 指定结点的后插操作
//后插操作:在p结点之后插入元素e
bool InsertNextNode(LNode *p,ElemType e){
if(p==NULL)
return false;
LNode *s=(LNode*)malloc(sizeof(LNode));
if(s==NULL)
return false;
s->data=e; //将e存入s结点
s->next=p->next; //s结点的指针改成p的指针
p->next=s; //p的指针指向s结点
return true;
}
3.4 指定结点的前插操作
//前插操作:在p结点之前插入元素e
//实际上是 后插后 交换s和p
bool InsertPriorNode(LNode *p,ElemType e){
if(p==NULL)
return false;
LNode *s=(LNode*)malloc(sizeof(LNode));
if(s==NULL)
return false;
s->next=p->next; //s结点的指针改为p指针
p->next=s; //p指向s结点
s->data=p->data; //将p结点的数据复制到s结点
p->data=e; //p结点的数据改为e
}
4.单链表的删除
4.1 按位序删除
//按位序删除
bool ListDelete(LinkList &L,int i,ElemType &e){
if(i<1)
return false;
LNode *p;
int j=0;
p=L; //L指向头结点 头结点不存数据
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL)
return false;
if(p->next==NULL)//i-1个结点后无结点了
return false;
LNode *q=p->next; //令q指向被删除结点
e=q->data; //用e返回元素的值
p->next=q->next; //将*q结点从链中 断开
free(q); //删除
return true;
}
4.2 指定结点删除(最后一个不行)
//指定结点删除
bool DeleteNode(LNode *p){
if(p==NULL)
return false;
LNode *q=p->next;
p->data=p->next->data;
p->next=q->next;
free(q);
return true;
}
5.单链表的查找
5.1 按位查找
//按位查找
LNode *GetElem(LinkList L,int i){
if(i<0)
return NULL;
LNode *p;
int j=0;
p=L;
while(p!=NULL&&j<i){
p=p->next;
j++;
}
return p;//返回第i个元素
}
5.2 按值查找
//按值查找
LNode *LocateElem(LinkList L,ElemType e){
LNode *p=L->next;
//从第一个结点开始查找数据域为e的结点
while(p!=NULL&&p->data!=e)
p=p->next;
return p;
}
6.求表长
//求表长
int Length(LinkList L){
int len=0;
LNode *p=L;
while(p->next!=NULL){
p=p->next;
len++;
}
return len;
}
7.单链表的建立
7.1 尾插法
LinkList List_TailInsert(LinkList &L){
int x;
L=(LinkList)malloc(sizeof(LNode));//建立头结点
LNode*s,*r=L;//r为尾指针
scanf("%d",&x);
while(x!=9999)//输入为9999结束
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x; //s结点数据域为x
r->next=s; //尾指针指向新结点s
r=s; //将尾指针设置为s
scanf("%d",&x);
}
r->next=NULL; //对尾指针的指针设置为空
return L;
}
7.2 尾插法(链表的逆置)
LinkList List_TailInsert2(LinkList &L) {
int x;
LNode *s;
L = (LinkList) malloc(sizeof(LNode));//建立头结点
L->next=NULL; //置空
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}