一、单链表的初始化
//单链表的初始化(不带头结点)
#include <stdio.h>
#include <stdlib.h> //malloc、free函数的头文件
typedef struct LNode{ //定义单链表结点类型
int data; //每个结点存放一个数据元素
struct LNode *next; //指针指向下一个结点
}LNode,*LinkList;
//初始化单链表
bool InitList(LinkList &L){
L = NULL; //空表,暂时没有任何结点
return true;
}
int main(){
LinkList L; //声明一个单链表的指针
InitList(L); //初始化单链表
return 0;
}
//单链表的初始化(带头结点)
#include <stdio.h>
#include <stdlib.h> //malloc、free函数的头文件
typedef struct LNode{ //定义单链表结点类型
int data; //每个结点存放一个数据元素
struct LNode *next; //指针指向下一个结点
}LNode,*LinkList;
//初始化单链表
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode)); //分配一个头结点
if(L == NULL) return false; //内存不足分配失败
L->next=NULL; // 头结点之后暂时还没有结点
return true;
}
int main(){
LinkList L; //声明一个单链表的指针
InitList(L); //初始化单链表
return 0;
}
二、单链表的插入
//单链表的按位序插入(带头结点)
#include <stdio.h>
#include <stdlib.h> //malloc、free函数的头文件
typedef struct LNode{ //定义单链表结点类型
int data; //每个结点存放一个数据元素
struct LNode *next; //指针指向下一个结点
}LNode,*LinkList;
//初始化单链表
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode)); //分配一个头结点
if(L == NULL) return false; //内存不足分配失败
L->next=NULL; // 头结点之后暂时还没有结点
return true;
}
//在第i个位置插入元素e (带头结点)
bool ListInsert(LinkList &L, int i, int e){
if(i<1) return false; //i值不合法
LNode *p; //指针p,指向当前扫描到的结点
int j=0; //当前p指向的是第几个结点
p = L; //L指向头结点
while(p!=NULL && j<i-1){ //循环找到第i-1个结点
p=p->next;
j++;
}
if(p==NULL) return false; //i值不合法
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data = e;
s->next=p->next;
p->next=s; //将结点s连到p之后
return true; //插入成功
}
int main(){
LinkList L; //声明一个单链表的指针
InitList(L); //初始化单链表
ListInsert(L,1,11); //插入
return 0;
}
//单链表的按位序插入(不带头结点)
#include <stdio.h>
#include <stdlib.h> //malloc、free函数的头文件
typedef struct LNode{ //定义单链表结点类型
int data; //每个结点存放一个数据元素
struct LNode *next; //指针指向下一个结点
}LNode,*LinkList;
//初始化单链表
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode)); //分配一个头结点
if(L == NULL) return false; //内存不足分配失败
L->next=NULL; // 头结点之后暂时还没有结点
return true;
}
//在第i个位置插入元素e (不带头结点)
bool ListInsert(LinkList &L,int i,int e){
if(i<1) return false;
if(i==1){ //插入第1个结点的操作与其他结点操作不同
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=L;
L=s; //头指针指向新结点
return true;
}
LNode *p; //指针p指向当前扫描到的结点
int j=1; //当前p指向的是第几个结点
p=L; //p指向第一个结点,不是头结点
while(p!=NULL&&j<i-1){ //循环找到第i-1个结点
p=p->next;
j++;
}
if(p==NULL) return false; //i值不合法
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return true; //插入成功
}
int main(){
LinkList L; //声明一个单链表的指针
InitList(L); //初始化单链表
ListInsert(L,1,11); //插入
ListInsert(L,2,12);
ListInsert(L,3,13);
return 0;
}
//单链表指定结点的后插
#include <stdio.h>
#include <stdlib.h> //malloc、free函数的头文件
typedef struct LNode{ //定义单链表结点类型
int data; //每个结点存放一个数据元素
struct LNode *next; //指针指向下一个结点
}LNode,*LinkList;
//初始化单链表
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode)); //分配一个头结点
if(L == NULL) return false; //内存不足分配失败
L->next=NULL; // 头结点之后暂时还没有结点
return true;
}
//在第i个位置插入元素e (带头结点)
bool ListInsert(LinkList &L, int i, int e){
if(i<1) return false; //i值不合法
LNode *p; //指针p,指向当前扫描到的结点
int j=0; //当前p指向的是第几个结点
p = L; //L指向头结点
while(p!=NULL && j<i-1){ //循环找到第i-1个结点
p=p->next;
j++;
}
if(p==NULL) return false; //i值不合法
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data = e;
s->next=p->next;
p->next=s; //将结点s连到p之后
return true; //插入成功
}
//在p结点之后插入元素e
bool InsertNextNode(LNode *p, int e){
if(p==NULL) return false; //p结点不合法
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL) return false; //内存分配失败
s->data = e; //用结点s保存数据元素e
s->next=p->next;
p->next=s; //将结点s连到p之后
return true; //插入成功
}
int main(){
LinkList L; //声明一个单链表的指针
InitList(L); //初始化单链表
ListInsert(L,1,10);
ListInsert(L,2,12);
ListInsert(L,3,13);
ListInsert(L,4,14);
LNode *t=L->next;
InsertNextNode(t,11); //后插
//打印数据
L=L->next;
while(L!=NULL){
printf("%d\n",L->data);
L=L->next;
}
return 0;
}
//单链表指定结点的前插
#include <stdio.h>
#include <stdlib.h> //malloc、free函数的头文件
typedef struct LNode{ //定义单链表结点类型
int data; //每个结点存放一个数据元素
struct LNode *next; //指针指向下一个结点
}LNode,*LinkList;
//初始化单链表
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode)); //分配一个头结点
if(L == NULL) return false; //内存不足分配失败
L->next=NULL; // 头结点之后暂时还没有结点
return true;
}
//在第i个位置插入元素e (带头结点)
bool ListInsert(LinkList &L, int i, int e){
if(i<1) return false; //i值不合法
LNode *p; //指针p,指向当前扫描到的结点
int j=0; //当前p指向的是第几个结点
p = L; //L指向头结点
while(p!=NULL && j<i-1){ //循环找到第i-1个结点
p=p->next;
j++;
}
if(p==NULL) return false; //i值不合法
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data = e;
s->next=p->next;
p->next=s; //将结点s连到p之后
return true; //插入成功
}
//在p结点之前插入元素e
bool InsertPriorNode(LNode *p, int e){
if(p==NULL) return false; //p结点不合法
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL) return false; //内存分配失败
s->next=p->next;
p->next=s; //新结点s连到p之后
s->data=p->data; //将p中元素复制到s中
p->data=e; //p中元素覆盖为e
return true; //插入成功
}
int main(){
LinkList L; //声明一个单链表的指针
InitList(L); //初始化单链表
ListInsert(L,1,11);
ListInsert(L,2,12);
ListInsert(L,3,13);
ListInsert(L,4,14);
LNode *t=L->next;
InsertPriorNode(t,10); //前插
//打印数据
L=L->next;
while(L!=NULL){
printf("%d\n",L->data);
L=L->next;
}
return 0;
}
三、单链表的删除
//单链表按位序删除
#include <stdio.h>
#include <stdlib.h> //malloc、free函数的头文件
typedef struct LNode{ //定义单链表结点类型
int data; //每个结点存放一个数据元素
struct LNode *next; //指针指向下一个结点
}LNode,*LinkList;
//初始化单链表
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode)); //分配一个头结点
if(L == NULL) return false; //内存不足分配失败
L->next=NULL; // 头结点之后暂时还没有结点
return true;
}
//在第i个位置插入元素e (带头结点)
bool ListInsert(LinkList &L, int i, int e){
if(i<1) return false; //i值不合法
LNode *p; //指针p,指向当前扫描到的结点
int j=0; //当前p指向的是第几个结点
p = L; //L指向头结点
while(p!=NULL && j<i-1){ //循环找到第i-1个结点
p=p->next;
j++;
}
if(p==NULL) return false; //i值不合法
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data = e;
s->next=p->next;
p->next=s; //将结点s连到p之后
return true; //插入成功
}
//在第i个位置删除元素e
bool ListDelete(LinkList &L, int i, int &e){
if(i<1) return false; //i值不合法
LNode *p; //指针p,指向当前扫描到的结点
int j=0; //当前p指向的是第几个结点
p = L; //L指向头结点
while(p!=NULL && j<i-1){ //循环找到第i-1个结点
p=p->next;
j++;
}
if(p==NULL) return false; //i值不合法
if(p->next==NULL) return false; //i-1个结点之后已无其他结点
LNode *q=p->next; //令q指向被删除的结点
e=q->data; //用e返回元素的值
p->next=q->next;
free(q); //释放结点存储空间
return true; //删除成功
}
int main(){
LinkList L; //声明一个单链表的指针
InitList(L); //初始化单链表
ListInsert(L,1,11);
ListInsert(L,2,12);
ListInsert(L,3,13);
ListInsert(L,4,14);
int e=0;
ListDelete(L,1,e); //删除
printf("%d\n",e);
//打印数据
L=L->next;
while(L!=NULL){
printf("%d\n",L->data);
L=L->next;
}
return 0;
}
//单链表按指定结点删除
#include <stdio.h>
#include <stdlib.h> //malloc、free函数的头文件
typedef struct LNode{ //定义单链表结点类型
int data; //每个结点存放一个数据元素
struct LNode *next; //指针指向下一个结点
}LNode,*LinkList;
//初始化单链表
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode)); //分配一个头结点
if(L == NULL) return false; //内存不足分配失败
L->next=NULL; // 头结点之后暂时还没有结点
return true;
}
//在第i个位置插入元素e (带头结点)
bool ListInsert(LinkList &L, int i, int e){
if(i<1) return false; //i值不合法
LNode *p; //指针p,指向当前扫描到的结点
int j=0; //当前p指向的是第几个结点
p = L; //L指向头结点
while(p!=NULL && j<i-1){ //循环找到第i-1个结点
p=p->next;
j++;
}
if(p==NULL) return false; //i值不合法
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data = e;
s->next=p->next;
p->next=s; //将结点s连到p之后
return true; //插入成功
}
//删除指定结点p
bool DeleteNode(LNode *p){
if(p==NULL) return false; //结点p不合法
if(p->next==NULL) return false; //p结点之后已无其他结点
LNode *q=p->next; //令q指向p结点的后继结点
p->data=q->data; //和后继结点交换数据域
p->next=q->next;
free(q); //释放后继结点的存储空间
return true; //删除成功
}
int main(){
LinkList L; //声明一个单链表的指针
InitList(L); //初始化单链表
ListInsert(L,1,11);
ListInsert(L,2,12);
ListInsert(L,3,13);
ListInsert(L,4,14);
LNode *t=L->next;
DeleteNode(t); //删除
//打印数据
L=L->next;
while(L!=NULL){
printf("%d\n",L->data);
L=L->next;
}
return 0;
}
四、单链表的查找
//单链表的按位查找
#include <stdio.h>
#include <stdlib.h> //malloc、free函数的头文件
typedef struct LNode{ //定义单链表结点类型
int data; //每个结点存放一个数据元素
struct LNode *next; //指针指向下一个结点
}LNode,*LinkList;
//初始化单链表
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode)); //分配一个头结点
if(L == NULL) return false; //内存不足分配失败
L->next=NULL; // 头结点之后暂时还没有结点
return true;
}
//在第i个位置插入元素e (带头结点)
bool ListInsert(LinkList &L, int i, int e){
if(i<1) return false; //i值不合法
LNode *p; //指针p,指向当前扫描到的结点
int j=0; //当前p指向的是第几个结点
p = L; //L指向头结点
while(p!=NULL && j<i-1){ //循环找到第i-1个结点
p=p->next;
j++;
}
if(p==NULL) return false; //i值不合法
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data = e;
s->next=p->next;
p->next=s; //将结点s连到p之后
return true; //插入成功
}
//按位查找,返回第i个元素的值
bool GetElem(LinkList L, int i, int &e){
if(i<1) return false; //i值不合法
LNode *p; //指针p,指向当前扫描到的结点
int j=0; //当前p指向的是第几个结点
p = L; //L指向头结点
while(p!=NULL && j<i){ //循环找到第i个结点
p=p->next;
j++;
}
e=p->data; //p结点的值赋给e,返回
return true; //查找成功
}
int main(){
LinkList L; //声明一个单链表的指针
InitList(L); //初始化单链表
ListInsert(L,1,11);
ListInsert(L,2,12);
ListInsert(L,3,13);
ListInsert(L,4,14);
int e=0;
GetElem(L,4,e); //查找
printf("%d\n",e); //打印数据
return 0;
}
//单链表的按值查找
#include <stdio.h>
#include <stdlib.h> //malloc、free函数的头文件
typedef struct LNode{ //定义单链表结点类型
int data; //每个结点存放一个数据元素
struct LNode *next; //指针指向下一个结点
}LNode,*LinkList;
//初始化单链表
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode)); //分配一个头结点
if(L == NULL) return false; //内存不足分配失败
L->next=NULL; // 头结点之后暂时还没有结点
return true;
}
//在第i个位置插入元素e (带头结点)
bool ListInsert(LinkList &L, int i, int e){
if(i<1) return false; //i值不合法
LNode *p; //指针p,指向当前扫描到的结点
int j=0; //当前p指向的是第几个结点
p = L; //L指向头结点
while(p!=NULL && j<i-1){ //循环找到第i-1个结点
p=p->next;
j++;
}
if(p==NULL) return false; //i值不合法
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data = e;
s->next=p->next;
p->next=s; //将结点s连到p之后
return true; //插入成功
}
//按值查找,找到数据域==e的结点
LNode * LocateElem(LinkList L, int e){
LNode *p=L->next; //从第一个结点开始查找数据域为e的结点
while(p!=NULL && p->data!=e){
p=p->next;
}
return p; //找到后返回该结点的指针,否则返回NULL
}
int main(){
LinkList L; //声明一个单链表的指针
InitList(L); //初始化单链表
ListInsert(L,1,11);
ListInsert(L,2,12);
ListInsert(L,3,13);
ListInsert(L,4,14);
LNode *t=LocateElem(L,14); //查找
int e=t->data;
printf("%d\n",e); //打印数据
return 0;
}
五、求单链表的长度
//求单链表的长度
#include <stdio.h>
#include <stdlib.h> //malloc、free函数的头文件
typedef struct LNode{ //定义单链表结点类型
int data; //每个结点存放一个数据元素
struct LNode *next; //指针指向下一个结点
}LNode,*LinkList;
//初始化单链表
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode)); //分配一个头结点
if(L == NULL) return false; //内存不足分配失败
L->next=NULL; // 头结点之后暂时还没有结点
return true;
}
//在第i个位置插入元素e (带头结点)
bool ListInsert(LinkList &L, int i, int e){
if(i<1) return false; //i值不合法
LNode *p; //指针p,指向当前扫描到的结点
int j=0; //当前p指向的是第几个结点
p = L; //L指向头结点
while(p!=NULL && j<i-1){ //循环找到第i-1个结点
p=p->next;
j++;
}
if(p==NULL) return false; //i值不合法
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data = e;
s->next=p->next;
p->next=s; //将结点s连到p之后
return true; //插入成功
}
//求单链表的长度
int Length(LinkList L){
int len = 0; //统计表长
LNode *p=L;
while (p->next != NULL){
p=p->next;
len++;
}
return len;
}
int main(){
LinkList L; //声明一个单链表的指针
InitList(L); //初始化单链表
ListInsert(L,1,11);
ListInsert(L,2,12);
ListInsert(L,3,13);
ListInsert(L,4,14);
int e=Length(L);
printf("%d\n",e);
return 0;
}