1.单链表的定义
//单链表定义
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
2.单链表的插入操作(头插法和尾插法)
(1)头插法(带头结点)
//头插法(带头结点)
LinkList List_HeadInsert(LinkList &L){
LNode *s;
int x;
L = (LinkList)malloc(sizeof(LNode)); //创建头结点
L->next = NULL; //初始为空链表
scanf("%d", &x);
while(x!=9999){
s = (LinkList)malloc(sizeof(LNode)); //创建新结点
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d", &x);
}
return L;
}
(2)头插法(不带头结点)
//头插法(不带头结点)
LinkList List_HeadInsert(LinkList &L){
LNode *s;
int x;
L = NULL; //初始为空链表
scanf("%d", &x);
while(x!=9999){
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = L;
L = s;
scanf("%d", x);
}
return L;
}
(3)尾插法(带头结点)
//尾插法(带头结点)
LinkList List_TailInsert(LinkList &L){
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
LNode *s, *r; //r表示尾指针
r = L; //r指向头结点,此时终端结点就是头结点
scanf("%d", &x);
while(x!=9999){
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s; //用r来接纳新结点
r = s; //r指向新的终端结点
scanf("%d", &x);
}
r->next = NULL: //尾结点指针置空
return L;
}
(4)尾插法(不带头结点)
//尾插法(不带头结点)
LinkList List_TailInsert(LinkList &L){
int x;
L = (LinkList)malloc(sizeof(LNode));
L = NULL;
LNode *s, *r;
r = L;
scanf("%d", &x);
while(x!=9999){
s = (LinkList)malloc(sizeof(LNode));
if(L==NULL){ //如果链表为空,要插入第一个结点
L = s;
r = L;
} else{ //插入第一个以外的结点
r->next = s;
r = s;
}
scanf("%d", &x);
}
return L;
}
3.单链表的删除操作
(1)按位序删除结点(带头结点)
//按位序删除结点(带头结点)
bool ListDelete(LinkList &L, int i, ElemType &e){
if(i<0) return false;
int j=0;
LNode *p=L, *q;
while(p!=NULL && j<i-1){
p = p->next;
j++;
}
if(p==NULL) return false;//i值不合法
if(p->next == NULL) return false;//第i-1个结点之后已无其他结点
q = p->next;//令q指向被删除结点
e = q->data;
p->next = q->next;
free(q);
return true;
(2)指定结点的删除
//指定结点的删除
bool ListDelete(LNode *p){
if(p==NULL) return false;
LNode *q = p->next;//令q指向p的后继结点
p->data = q->data;//p和q交换数据域
p->next = q->next;
free(q);
return true;
}
4.对单链表进行查找
(1)按序号查找结点值
//按序号查找结点值
LNode *GetElem(LinkList L, int i){
int j=1;
LNode *p=L->next;
if(i==0) return L;
if(i<1) return NULL;
while(p!=NULL&&j<i){
p = p->next;
j++;
}
return p;
}
(2)按值查找表结点
LNode *LocateElem(LinkList L, ElemType e){
LNode *p=L->next;
while(p!=NULL && p->data!=e)
p = p->next;
return p;
}
5.表的长度
//求表的长度
int Length(LinkList L){
LNode *p=L;
int len=0; //统计表长
while(p->next!=NULL){
p=p->next;
len++;
}
return len;
}