1.简介
单链表是什么?
一种动态的存储结构,在每个节点中除包含有数据域以外只设置一个指针域(区分与双链表),用于指向其后继节点,这样构成的链表称为单链表。
在线性表的单链表中,通常每个链表带有一个头节点,并通过头节点的指针唯一标识该链表,称之为头指针。
2.单链表的基本实现(分区)
1.单链表结构体
typedef struct LNode{
ElemType data;//存放元素值
struct LNode *next;//指向后继节点
}LinkNode;
2.头插法建立单链表
L为头节点,一直在头节点之后插入,即为头插法。
s->next=L->next;
L-next=s;
//这两步为关键操作
//2.头插法建立单链表
void CreateListF(LinkNode *&L,ElemType a[],int n){
LinkNode *s;
L=(LinkNode *) malloc (sizeof(LinkNode));
L->next=NULL;//L为头节点。
for(int i=0;i<n;i++){
s=(LinkNode *) malloc(sizeof(LinkNode));
s->data=a[i];
s->next=L->next;
L-next=s;
}
}
3.尾插法建立单链表
关键步骤:(比头插法多用了一个指针,一直指向尾节点)。
r->next=s;
r=s;
具体代码实现:
//3.尾插法建立单链表
void CreateListR(LinkNode *&L,ElemType a[],int n){
LinkNode *s,*r;
L=(LinkNode *) malloc (sizeof(LinkNode));//L--为头节点,
r=L;//r--始终指向尾节点
for(int i=0;i<n;i++){
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
4.初始化线性表
主要是创建头节点并将其next域置为空。
void InitList(LinkNode *&L){
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;//L---为头节点
}
5.销毁线性表
遍历线性表一个一个释放空间。
//5.销毁线性表
void DestroyList(LinkNode *&L){
LinkNode *pre=L,*p=L->next;
while(p!=NULL){
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
6.判断线性表是否为空
判断头节点的下一个是否为空就可以了。
bool ListEmpty(LinkNode *L){
return (L->next==NULL);
}
7.求线性表的长度
//7.求线性表的长度
int ListLength(LinkNode *L){
int n=0;
LinkNode *p=L;
while(p->next!=NULL){
n++;
p=p->next;
}
return n;
}
8.输出线性表
这个比较简单,直接看代码就行
//8.输出线性表
void DispList(LinkNode *L){
LinkNode *p=L->next;
while(p!=NULL){
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
9.求线性表中的某个数据元素值
也比较简单
//9.求线性表中的某个数据元素值
bool GetElem(LinkNode *L,int i,ElemType &e){
int j=0;
LinkNode *p=L;
if(i<=0) return false;
while(j<i && p!=NULL){
j++;
p=p->next;
}
if(p==NULL) return false;
else {
e=p->data;
return true;
}
}
10.按元素值查找
//10.按元素值查找
int LocateElem(LinkNode *L,ElemType e){
int i=1;
LinkNode *p=L->next;
while(p!=NULL&&p->data!=e){
p=p->next;
i++;
}
if(p==NULL) return 0;
else return i;
}
11.插入数据元素
bool ListInsert(LinkNode *&L,int i,ElemType e){
int j=0;//头节点的序号
LinkNode *p=L,*s;
if(i<=0) return false;
while(j<i-1 && p!=NULL){
j++;
p=p->next;
}
if(p==NUll) return false;
else {
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
}
12.删除数据元素
//12.删除数据元素
bool ListDelete(LinkNode *&L,int i,ElemType &e){
int j=0;
LinkNode *p=L,*q;
if(i<=0) return false;
while(j<i-1 && p!=NULL){
j++;
p=p->next;
}
if(p==NULL) return false;
else {
q=p->next;
if(q==NULL) return false;
e=q->data;
p->next=q->next;
free(q);
return true;
}
}