C++王道数据结构:线性表

线性表

以下代码参考了【王道数据结构】,并作了适量补充,如有错,请指出

1.顺序表

1.1顺序表–静态存储–初始化

#include <windows.h>
#include <stdio.h>
#define MaxSize 10

typedef int ElemType;

//顺序表结构体的定义
typedef struct {
    
    
	ElemType data[MaxSize];
	int length;
}SqList;

//顺序表初始化
void InitList(SqList &L) {
    
    
	for (int i = 0; i < MaxSize; i++)
		L.data[i] = 0;
	L.length = 0;
}

int main() {
    
    
	SetConsoleOutputCP(65001);
	SqList L;
	printf("顺序表初始化:\n");
	InitList(L);
	for (int i = 0; i < MaxSize; i++)
		printf("data[%d]=%d\n", i, L.data[i]);
	return 0;
}

输出结果如下:

顺序表初始化:
data[0]=0
data[1]=0
data[2]=0
data[3]=0
data[4]=0
data[5]=0
data[6]=0
data[7]=0
data[8]=0
data[9]=0

1.2顺序表–动态存储–初始化

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#define InitSize 10

typedef int ElemType;

//顺序表结构体的定义
typedef struct {
    
    
	ElemType *data;
	int MaxSize;
	int length;
}SqList;

//顺序表初始化
void InitList(SqList &L) {
    
    
	L.data=(ElemType *)malloc(InitSize*sizeof(ElemType));
	L.length = 0;
	L.MaxSize=InitSize;
	for (int i = 0; i < InitSize; i++){
    
    
		L.data[i] = 0;
	}
}

int main() {
    
    
	SetConsoleOutputCP(65001);
	SqList L;
	printf("顺序表初始化:\n");
	InitList(L);
	for (int i = 0; i < L.MaxSize; i++) {
    
    
		printf("data[%d]=%d\n", i, L.data[i]);
	}
	return 0;
}

输出结果如下:

顺序表初始化:
data[0]=0
data[1]=0
data[2]=0
data[3]=0
data[4]=0
data[5]=0
data[6]=0
data[7]=0
data[8]=0
data[9]=0

1.3顺序表–按位序插入元素

#include <windows.h>
#include <stdio.h>
#define MaxSize 10

typedef int ElemType;

//顺序表结构体的定义
typedef struct {
    
    
	ElemType data[MaxSize];
	int length;
}SqList;

//顺序表初始化
void InitList(SqList &L) {
    
    
	for (int i = 0; i < MaxSize; i++)
		L.data[i] = 0;
	L.length = 0;
}

//顺序表插入元素
bool ListInsert(SqList &L,int i,ElemType e){
    
    
	if (i<1||i>L.length+1)
		return false;
	if (L.length>=MaxSize)
		return false;
	for (int j=L.length;j>=i;j--)
		L.data[j]=L.data[j-1];
	L.data[i-1]=e;
	L.length++;
	return true;
}

int main() {
    
    
	SetConsoleOutputCP(65001);
	SqList L;
	InitList(L);
	printf("顺序表初始化:\n顺序表长度为:%d\n",L.length);
	for (int i = 0; i < MaxSize; i++)
		printf("data[%d]=%d\n", i, L.data[i]);
	ListInsert(L,1,10);
	ListInsert(L,2,20);
	ListInsert(L,3,30);
	ListInsert(L,4,40);
	ListInsert(L,5,50);
	printf("顺序表插入元素:\n顺序表长度为:%d\n",L.length);
	for (int i = 0; i < MaxSize; i++)
		printf("data[%d]=%d\n", i, L.data[i]);
	return 0;
}

输出结果如下:

顺序表初始化:
顺序表长度为:0
data[0]=0
data[1]=0
data[2]=0
data[3]=0
data[4]=0
data[5]=0
data[6]=0
data[7]=0
data[8]=0
data[9]=0
顺序表插入元素:
顺序表长度为:5
data[0]=10
data[1]=20
data[2]=30
data[3]=40
data[4]=50
data[5]=0
data[6]=0
data[7]=0
data[8]=0
data[9]=0

1.4顺序表–指定结点的删除操作

#include <windows.h>
#include <stdio.h>
#define MaxSize 10

typedef int ElemType;

//顺序表结构体的定义
typedef struct {
    
    
	ElemType data[MaxSize];
	int length;
}SqList;

//顺序表初始化
void InitList(SqList &L) {
    
    
	for (int i = 0; i < MaxSize; i++)
		L.data[i] = 0;
	L.length = 0;
}

//顺序表插入元素
bool ListInsert(SqList &L,int i,ElemType e){
    
    
	if (i<1||i>L.length+1)
		return false;
	if (L.length>=MaxSize)
		return false;
	for (int j=L.length;j>=i;j--)
		L.data[j]=L.data[j-1];
	L.data[i-1]=e;
	L.length++;
	return true;
}

//顺序表删除元素
bool ListDelete(SqList &L,int i,ElemType &e){
    
    
	if (i<1||i>L.length)
		return false;
	e=L.data[i-1];
	for (int j=i;j<L.length;j++)
		L.data[j-1]=L.data[j];
	L.length--;
	L.data[L.length]=0;
	return true;
}

int main() {
    
    
	SetConsoleOutputCP(65001);
	SqList L;
	InitList(L);
	printf("顺序表初始化:\n顺序表长度为:%d\n",L.length);
	for (int i = 0; i < MaxSize; i++)
		printf("data[%d]=%d\n", i, L.data[i]);
	ListInsert(L,1,10);
	ListInsert(L,2,20);
	ListInsert(L,3,30);
	ListInsert(L,4,40);
	ListInsert(L,5,50);
	printf("顺序表插入元素:\n顺序表长度为:%d\n",L.length);
	for (int i = 0; i < MaxSize; i++)
		printf("data[%d]=%d\n", i, L.data[i]);
	int e=-1;
	ListDelete(L,3,e);
	printf("顺序表删除元素:\n顺序表长度为:%d\n删除的元素为:%d\n",L.length,e);
	for (int i = 0; i < MaxSize; i++)
		printf("data[%d]=%d\n", i, L.data[i]);
	return 0;
}

输出结果如下:

顺序表初始化:
顺序表长度为:0
data[0]=0
data[1]=0
data[2]=0
data[3]=0
data[4]=0
data[5]=0
data[6]=0
data[7]=0
data[8]=0
data[9]=0
顺序表插入元素:
顺序表长度为:5
data[0]=10
data[1]=20
data[2]=30
data[3]=40
data[4]=50
data[5]=0
data[6]=0
data[7]=0
data[8]=0
data[9]=0
顺序表删除元素:
顺序表长度为:4
删除的元素为:30
data[0]=10
data[1]=20
data[2]=40
data[3]=50
data[4]=0
data[5]=0
data[6]=0
data[7]=0
data[8]=0
data[9]=0

1.5顺序表–按位查找元素

#include <windows.h>
#include <stdio.h>
#define MaxSize 10

typedef int ElemType;

//顺序表结构体的定义
typedef struct {
    
    
	ElemType data[MaxSize];
	int length;
}SqList;

//顺序表初始化
void InitList(SqList &L) {
    
    
	for (int i = 0; i < MaxSize; i++)
		L.data[i] = 0;
	L.length = 0;
}

//顺序表插入元素
bool ListInsert(SqList &L,int i,ElemType e){
    
    
	if (i<1||i>L.length+1)
		return false;
	if (L.length>=MaxSize)
		return false;
	for (int j=L.length;j>=i;j--)
		L.data[j]=L.data[j-1];
	L.data[i-1]=e;
	L.length++;
	return true;
}

//顺序表按位查找
int GetElem(SqList L,int i){
    
    
	return L.data[i-1];
}

int main() {
    
    
	SetConsoleOutputCP(65001);
	SqList L;
	InitList(L);
	printf("顺序表初始化:\n顺序表长度为:%d\n",L.length);
	for (int i = 0; i < MaxSize; i++)
		printf("data[%d]=%d\n", i, L.data[i]);
	ListInsert(L,1,10);
	ListInsert(L,2,20);
	ListInsert(L,3,30);
	ListInsert(L,4,40);
	ListInsert(L,5,50);
	printf("顺序表插入元素:\n顺序表长度为:%d\n",L.length);
	for (int i = 0; i < MaxSize; i++)
		printf("data[%d]=%d\n", i, L.data[i]);
	printf("顺序表查找元素(按位查找):\n顺序表第3位元素为:%d\n",GetElem(L,3));
	return 0;
}

输出结果如下:

顺序表初始化:
顺序表长度为:0
data[0]=0
data[1]=0
data[2]=0
data[3]=0
data[4]=0
data[5]=0
data[6]=0
data[7]=0
data[8]=0
data[9]=0
顺序表插入元素:
顺序表长度为:5
data[0]=10
data[1]=20
data[2]=30
data[3]=40
data[4]=50
data[5]=0
data[6]=0
data[7]=0
data[8]=0
data[9]=0
顺序表查找元素(按位查找):
顺序表第3位元素为:30

1.6顺序表–按值查找元素

#include <windows.h>
#include <stdio.h>
#define MaxSize 10

typedef int ElemType;

//顺序表结构体的定义
typedef struct {
    
    
	ElemType data[MaxSize];
	int length;
}SqList;

//顺序表初始化
void InitList(SqList &L) {
    
    
	for (int i = 0; i < MaxSize; i++)
		L.data[i] = 0;
	L.length = 0;
}

//顺序表插入元素
bool ListInsert(SqList &L,int i,ElemType e){
    
    
	if (i<1||i>L.length+1)
		return false;
	if (L.length>=MaxSize)
		return false;
	for (int j=L.length;j>=i;j--)
		L.data[j]=L.data[j-1];
	L.data[i-1]=e;
	L.length++;
	return true;
}

//顺序表按值查找
int LocateElem(SqList L,ElemType e){
    
    
	for (int i=0;i<L.length;i++)
		if (L.data[i]==e)
			return i+1;
	return -1;
}

int main() {
    
    
	SetConsoleOutputCP(65001);
	SqList L;
	InitList(L);
	printf("顺序表初始化:\n顺序表长度为:%d\n",L.length);
	for (int i = 0; i < MaxSize; i++)
		printf("data[%d]=%d\n", i, L.data[i]);
	ListInsert(L,1,10);
	ListInsert(L,2,20);
	ListInsert(L,3,30);
	ListInsert(L,4,40);
	ListInsert(L,5,50);
	printf("顺序表插入元素:\n顺序表长度为:%d\n",L.length);
	for (int i = 0; i < MaxSize; i++)
		printf("data[%d]=%d\n", i, L.data[i]);
	printf("顺序表查找元素(按值查找):\n顺序表元素值为20在第%d位\n",LocateElem(L,20));
	return 0;
}

输出结果如下:

顺序表初始化:
顺序表长度为:0
data[0]=0
data[1]=0
data[2]=0
data[3]=0
data[4]=0
data[5]=0
data[6]=0
data[7]=0
data[8]=0
data[9]=0
顺序表插入元素:
顺序表长度为:5
data[0]=10
data[1]=20
data[2]=30
data[3]=40
data[4]=50
data[5]=0
data[6]=0
data[7]=0
data[8]=0
data[9]=0
顺序表查找元素(按值查找):
顺序表元素值为20在第2位

2.单链表

2.1单链表–带头结点–初始化

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//单链表结构体的定义
typedef struct LNode{
    
    
	ElemType 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;
}

//单链表判断是否为空
bool Empty(LinkList L){
    
    
	return (L->next==NULL);
}

//单链表打印输出
void PrintList(LinkList L){
    
    
	if (Empty(L)){
    
    
		printf("单链表元素为空。\n");
		return;
	}
	L=L->next;
	int i=0;
	while (L!=NULL){
    
    
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
    
    
	SetConsoleOutputCP(65001);
	LinkList L;
	printf("单链表初始化:\n");
	InitList(L);
	PrintList(L);
	return 0;
}

输出结果如下:

单链表初始化:
单链表元素为空。

2.2单链表–不带头结点–初始化

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//单链表结构体的定义
typedef struct LNode{
    
    
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;

//单链表初始化
bool InitList(LinkList &L){
    
    
	L=NULL;
	return true;
}

//单链表判断是否为空
bool Empty(LinkList L){
    
    
	return (L==NULL);
}

//单链表打印输出
void PrintList(LinkList L){
    
    
	if (Empty(L)){
    
    
		printf("单链表元素为空。\n");
		return;
	}
	int i=0;
	while (L!=NULL){
    
    
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
    
    
	SetConsoleOutputCP(65001);
	LinkList L;
	printf("单链表初始化:\n");
	InitList(L);
	PrintList(L);
	return 0;
}

输出结果如下:

单链表初始化:
单链表元素为空。

2.3单链表–带头结点–按位序插入元素

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//单链表结构体的定义
typedef struct LNode{
    
    
	ElemType 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;
}

//单链表判断是否为空
bool Empty(LinkList L){
    
    
	return (L->next==NULL);
}

//单链表插入元素(按位序插入)
bool ListInsert(LinkList &L,int i,ElemType e){
    
    
	if (i<1)
		return false;
	LNode *p;
	int j=0;
	p=L;
	while (p!=NULL && j<i-1){
    
    
		p=p->next;
		j++;
	}
	if (p==NULL)
		return false;
	LNode *s=(LNode *)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return true;
}

//单链表长度计算
int Length(LinkList L){
    
    
	int len=0;
	LNode *p=L;
	while(p->next!=NULL){
    
    
		p=p->next;
		len++;
	}
	return len;
}

//单链表打印输出
void PrintList(LinkList L){
    
    
	if (Empty(L)){
    
    
		printf("单链表元素为空。\n");
		return;
	}
	L=L->next;
	int i=0;
	while (L!=NULL){
    
    
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
    
    
	SetConsoleOutputCP(65001);
	LinkList L;
	printf("单链表初始化:\n");
	InitList(L);
    printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("单链表插入元素:\n");
	ListInsert(L,1,10);
	ListInsert(L,2,20);
	ListInsert(L,3,30);
	ListInsert(L,4,40);
	ListInsert(L,5,50);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	return 0;
}

输出结果如下:

单链表初始化:
单链表长度为:0
单链表元素为空。
单链表插入元素:
单链表长度为:5
data[0]=10
data[1]=20
data[2]=30
data[3]=40
data[4]=50

2.4单链表–不带头结点–按位序插入元素

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//单链表结构体的定义
typedef struct LNode{
    
    
	int data;
	struct LNode *next;
}LNode,*LinkList;

//单链表初始化
bool InitList(LinkList &L){
    
    
	L=NULL;
	return true;
}

//单链表判断是否为空
bool Empty(LinkList L){
    
    
	return (L==NULL);
}

//单链表插入元素(按位序插入)
bool ListInsert(LinkList &L,int i,ElemType e){
    
    
	if (i<1)
		return false;
	if (i==1){
    
    
		LNode *s=(LNode*)malloc(sizeof(LNode));
		s->data=e;
		s->next=L;
		L=s;
		return true;
	}
	LNode *p;
	int j=1;
	p=L;
	while (p!=NULL && j<i-1){
    
    
		p=p->next;
		j++;
	}
	if (p==NULL)
		return false;
	LNode *s=(LNode*)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return true;
}

//单链表长度计算
int Length(LinkList L){
    
    
	int len=0;
	LNode *p=L;
	while(p!=NULL){
    
    
		p=p->next;
		len++;
	}
	return len;
}

//单链表打印输出
void PrintList(LinkList L){
    
    
	if (Empty(L)){
    
    
		printf("单链表元素为空。\n");
		return;
	}
	int i=0;
	while (L!=NULL){
    
    
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
    
    
	SetConsoleOutputCP(65001);
	LinkList L;
	printf("单链表初始化:\n");
	InitList(L);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("单链表插入元素:\n");
	ListInsert(L,1,10);
	ListInsert(L,2,20);
	ListInsert(L,3,30);
	ListInsert(L,4,40);
	ListInsert(L,5,50);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	return 0;
}

输出结果如下:

单链表初始化:
单链表长度为:0
单链表元素为空。
单链表插入元素:
单链表长度为:5
data[0]=10
data[1]=20
data[2]=30
data[3]=40
data[4]=50

2.5单链表–指定结点的后插操作

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//单链表结构体的定义
typedef struct LNode{
    
    
	ElemType 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;
}

//单链表判断是否为空
bool Empty(LinkList L){
    
    
	return (L->next==NULL);
}

//单链表指定结点后插操作
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;
	s->next=p->next;
	p->next=s;
	return true;
}

//单链表插入元素(按位序插入)
bool ListInsert(LinkList &L,int i,ElemType e){
    
    
	if (i<1)
		return false;
	LNode *p;
	int j=0;
	p=L;
	while (p!=NULL && j<i-1){
    
    
		p=p->next;
		j++;
	}
	return InsertNextNode(p,e);
}

//单链表长度计算
int Length(LinkList L){
    
    
	int len=0;
	LNode *p=L;
	while(p->next!=NULL){
    
    
		p=p->next;
		len++;
	}
	return len;
}

//单链表打印输出
void PrintList(LinkList L){
    
    
	if (Empty(L)){
    
    
		printf("单链表元素为空。\n");
		return;
	}
	L=L->next;
	int i=0;
	while (L!=NULL){
    
    
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
    
    
	SetConsoleOutputCP(65001);
	LinkList L;
	printf("单链表初始化:\n");
	InitList(L);
    printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("单链表插入元素:\n");
	ListInsert(L,1,10);
	ListInsert(L,2,20);
	ListInsert(L,3,30);
	ListInsert(L,4,40);
	ListInsert(L,5,50);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	int i=2;
	int e=200;
	printf("单链表在第%d位插入值为%d的元素:\n",i,e);
	ListInsert(L,i,e);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	return 0;
}

输出结果如下:

单链表初始化:
单链表长度为:0
单链表元素为空。
单链表插入元素:
单链表长度为:5
data[0]=10
data[1]=20
data[2]=30
data[3]=40
data[4]=50
单链表在第2位插入值为200的元素:
单链表长度为:6
data[0]=10
data[1]=200
data[2]=20
data[3]=30
data[4]=40
data[5]=50

2.6单链表–指定结点的前插操作

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//单链表结构体的定义
typedef struct LNode{
    
    
	ElemType 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;
}

//单链表判断是否为空
bool Empty(LinkList L){
    
    
	return (L->next==NULL);
}

//单链表指定结点前插操作
bool InsertPriorNode(LinkList &L,int i,ElemType e){
    
    
	if (i<1)
		return false;
	LNode *p;
	int j=0;
	p=L;
	while (p!=NULL && j<i-1){
    
    
		p=p->next;
		j++;
	}
	if (p==NULL)
		return false;
	LNode *s=(LNode *)malloc(sizeof(LNode));
	if (s==NULL)
		return false;
	s->next=p->next;
	p->next=s;
	s->data=p->data;
	p->data=e;
	return true;
}

//单链表插入元素(按位序插入)
bool ListInsert(LinkList &L,int i,ElemType e){
    
    
	if (i<1)
		return false;
	LNode *p;
	int j=0;
	p=L;
	while (p!=NULL && j<i-1){
    
    
		p=p->next;
		j++;
	}
	if (p==NULL)
		return false;
	LNode *s=(LNode *)malloc(sizeof(LNode));
	if (s==NULL)
		return false;
	s->data=e;
	s->next=p->next;
	p->next=s;
	return true;
}

//单链表长度计算
int Length(LinkList L){
    
    
	int len=0;
	LNode *p=L;
	while(p->next!=NULL){
    
    
		p=p->next;
		len++;
	}
	return len;
}

//单链表打印输出
void PrintList(LinkList L){
    
    
	if (Empty(L)){
    
    
		printf("单链表元素为空。\n");
		return;
	}
	L=L->next;
	int i=0;
	while (L!=NULL){
    
    
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
    
    
	SetConsoleOutputCP(65001);
	LinkList L;
	printf("单链表初始化:\n");
	InitList(L);
    printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("单链表插入元素:\n");
	ListInsert(L,1,10);
	ListInsert(L,2,20);
	ListInsert(L,3,30);
	ListInsert(L,4,40);
	ListInsert(L,5,50);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	int i=2;
	int e=200;
	printf("单链表在第%d位前面(即第%d位)插入值为%d的元素:\n",i,i-1,e);
	InsertPriorNode(L,i,e);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	return 0;
}

输出结果如下:

单链表初始化:
单链表长度为:0
单链表元素为空。
单链表插入元素:
单链表长度为:5
data[0]=10
data[1]=20
data[2]=30
data[3]=40
data[4]=50
单链表在第2位前面(即第1位)插入值为200的元素:
单链表长度为:6
data[0]=200
data[1]=10
data[2]=20
data[3]=30
data[4]=40
data[5]=50

2.7单链表–带头结点–按位序删除元素

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//单链表结构体的定义
typedef struct LNode{
    
    
	ElemType 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;
}

//单链表判断是否为空
bool Empty(LinkList L){
    
    
	return (L->next==NULL);
}

//单链表插入元素(按位序插入)
bool ListInsert(LinkList &L,int i,ElemType e){
    
    
	if (i<1)
		return false;
	LNode *p;
	int j=0;
	p=L;
	while (p!=NULL && j<i-1){
    
    
		p=p->next;
		j++;
	}
	if (p==NULL)
		return false;
	LNode *s=(LNode *)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return true;
}

//单链表删除元素(按位序删除)
bool ListDelete(LinkList &L,int i,ElemType &e){
    
    
	if (i<1)
		return false;
	LNode *p;
	int j=0;
	p=L;
	while (p!=NULL && j<i-1){
    
    
		p=p->next;
		j++;
	}
	if (p==NULL)
		return false;
	if (p->next==NULL)
		return false;
	LNode *q=p->next;
	e=q->data;
	p->next=q->next;
	free(q);
	return true;
}

//单链表长度计算
int Length(LinkList L){
    
    
	int len=0;
	LNode *p=L;
	while(p->next!=NULL){
    
    
		p=p->next;
		len++;
	}
	return len;
}

//单链表打印输出
void PrintList(LinkList L){
    
    
	if (Empty(L)){
    
    
		printf("单链表元素为空。\n");
		return;
	}
	L=L->next;
	int i=0;
	while (L!=NULL){
    
    
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
    
    
	SetConsoleOutputCP(65001);
	LinkList L;
	printf("单链表初始化:\n");
	InitList(L);
    printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("单链表插入元素:\n");
	ListInsert(L,1,10);
	ListInsert(L,2,20);
	ListInsert(L,3,30);
	ListInsert(L,4,40);
	ListInsert(L,5,50);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("单链表删除元素:\n");
	int i=2;
	ElemType e;
	ListDelete(L,i,e);
	printf("单链表删除在第%d位值为%d的元素:\n",i,e);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	return 0;
}

输出结果如下:

单链表初始化:
单链表长度为:0
单链表元素为空。
单链表插入元素:
单链表长度为:5
data[0]=10
data[1]=20
data[2]=30
data[3]=40
data[4]=50
单链表删除元素:
单链表删除在第2位值为20的元素:
单链表长度为:4
data[0]=10
data[1]=30
data[2]=40
data[3]=50

2.8单链表–不带头结点–按位序删除元素

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//单链表结构体的定义
typedef struct LNode{
    
    
	int data;
	struct LNode *next;
}LNode,*LinkList;

//单链表初始化
bool InitList(LinkList &L){
    
    
	L=NULL;
	return true;
}

//单链表判断是否为空
bool Empty(LinkList L){
    
    
	return (L==NULL);
}

//单链表插入元素(按位序插入)
bool ListInsert(LinkList &L,int i,ElemType e){
    
    
	if (i<1)
		return false;
	if (i==1){
    
    
		LNode *s=(LNode*)malloc(sizeof(LNode));
		s->data=e;
		s->next=L;
		L=s;
		return true;
	}
	LNode *p;
	int j=1;
	p=L;
	while (p!=NULL && j<i-1){
    
    
		p=p->next;
		j++;
	}
	if (p==NULL)
		return false;
	LNode *s=(LNode*)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return true;
}

//单链表删除元素(按位序删除)
bool ListDelete(LinkList &L,int i,ElemType &e){
    
    
	if (i<1)
		return false;
	LNode *p;
	int j=1;
	p=L;
	while (p!=NULL && j<i-1){
    
    
		p=p->next;
		j++;
	}
	if (p==NULL)
		return false;
	if (p->next==NULL)
		return false;
	LNode *q=p->next;
	e=q->data;
	p->next=q->next;
	free(q);
	return true;
}

//单链表长度计算
int Length(LinkList L){
    
    
	int len=0;
	LNode *p=L;
	while(p!=NULL){
    
    
		p=p->next;
		len++;
	}
	return len;
}

//单链表打印输出
void PrintList(LinkList L){
    
    
	if (Empty(L)){
    
    
		printf("单链表元素为空。\n");
		return;
	}
	int i=0;
	while (L!=NULL){
    
    
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
    
    
	SetConsoleOutputCP(65001);
	LinkList L;
	printf("单链表初始化:\n");
	InitList(L);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("单链表插入元素:\n");
	ListInsert(L,1,10);
	ListInsert(L,2,20);
	ListInsert(L,3,30);
	ListInsert(L,4,40);
	ListInsert(L,5,50);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("单链表删除元素:\n");
	int i=2;
	ElemType e;
	ListDelete(L,i,e);
	printf("单链表删除在第%d位值为%d的元素:\n",i,e);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	return 0;
}

输出结果如下:

单链表初始化:
单链表长度为:0
单链表元素为空。
单链表插入元素:
单链表长度为:5
data[0]=10
data[1]=20
data[2]=30
data[3]=40
data[4]=50
单链表删除元素:
单链表删除在第2位值为20的元素:
单链表长度为:4
data[0]=10
data[1]=30
data[2]=40
data[3]=50

2.9单链表–带头结点–指定结点的删除操作

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//单链表结构体的定义
typedef struct LNode{
    
    
	ElemType 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;
}

//单链表判断是否为空
bool Empty(LinkList L){
    
    
	return (L->next==NULL);
}

//单链表插入元素(按位序插入)
bool ListInsert(LinkList &L,int i,ElemType e){
    
    
	if (i<1)
		return false;
	LNode *p;
	int j=0;
	p=L;
	while (p!=NULL && j<i-1){
    
    
		p=p->next;
		j++;
	}
	if (p==NULL)
		return false;
	LNode *s=(LNode *)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return true;
}

//单链表指定结点删除操作
bool DeleteNode(LNode *p,ElemType &e){
    
    
	if (p==NULL)
		return false;
	if (p->next==NULL)
		return false;
	LNode *q=p->next;
	e=q->data;
	p->next=q->next;
	free(q);
	return true;
}

//单链表删除元素(按位序删除)
bool ListDelete(LinkList &L,int i,ElemType &e){
    
    
	if (i<1)
		return false;
	LNode *p;
	int j=0;
	p=L;
	while (p!=NULL && j<i-1){
    
    
		p=p->next;
		j++;
	}
	return DeleteNode(p,e);
}

//单链表长度计算
int Length(LinkList L){
    
    
	int len=0;
	LNode *p=L;
	while(p->next!=NULL){
    
    
		p=p->next;
		len++;
	}
	return len;
}

//单链表打印输出
void PrintList(LinkList L){
    
    
	if (Empty(L)){
    
    
		printf("单链表元素为空。\n");
		return;
	}
	L=L->next;
	int i=0;
	while (L!=NULL){
    
    
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
    
    
	SetConsoleOutputCP(65001);
	LinkList L;
	printf("单链表初始化:\n");
	InitList(L);
    printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("单链表插入元素:\n");
	ListInsert(L,1,10);
	ListInsert(L,2,20);
	ListInsert(L,3,30);
	ListInsert(L,4,40);
	ListInsert(L,5,50);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("单链表删除元素:\n");
	int i=2;
	ElemType e;
	ListDelete(L,i,e);
	printf("单链表删除在第%d位值为%d的元素:\n",i,e);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	return 0;
}

输出结果如下:

单链表初始化:
单链表长度为:0
单链表元素为空。
单链表插入元素:
单链表长度为:5
data[0]=10
data[1]=20
data[2]=30
data[3]=40
data[4]=50
单链表删除元素:
单链表删除在第2位值为20的元素:
单链表长度为:4
data[0]=10
data[1]=30
data[2]=40
data[3]=50

2.10单链表–不带头结点–指定结点的删除操作

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//单链表结构体的定义
typedef struct LNode{
    
    
	int data;
	struct LNode *next;
}LNode,*LinkList;

//单链表初始化
bool InitList(LinkList &L){
    
    
	L=NULL;
	return true;
}

//单链表判断是否为空
bool Empty(LinkList L){
    
    
	return (L==NULL);
}

//单链表插入元素(按位序插入)
bool ListInsert(LinkList &L,int i,ElemType e){
    
    
	if (i<1)
		return false;
	if (i==1){
    
    
		LNode *s=(LNode*)malloc(sizeof(LNode));
		s->data=e;
		s->next=L;
		L=s;
		return true;
	}
	LNode *p;
	int j=1;
	p=L;
	while (p!=NULL && j<i-1){
    
    
		p=p->next;
		j++;
	}
	if (p==NULL)
		return false;
	LNode *s=(LNode*)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return true;
}

//单链表指定结点删除操作
bool DeleteNode(LNode *p,ElemType &e){
    
    
	if (p==NULL)
		return false;
	if (p->next==NULL)
		return false;
	LNode *q=p->next;
	e=q->data;
	p->next=q->next;
	free(q);
	return true;
}

//单链表删除元素(按位序删除)
bool ListDelete(LinkList &L,int i,ElemType &e){
    
    
	if (i<1)
		return false;
	LNode *p;
	int j=1;
	p=L;
	while (p!=NULL && j<i-1){
    
    
		p=p->next;
		j++;
	}
	return DeleteNode(p,e);
}

//单链表长度计算
int Length(LinkList L){
    
    
	int len=0;
	LNode *p=L;
	while(p!=NULL){
    
    
		p=p->next;
		len++;
	}
	return len;
}

//单链表打印输出
void PrintList(LinkList L){
    
    
	if (Empty(L)){
    
    
		printf("单链表元素为空。\n");
		return;
	}
	int i=0;
	while (L!=NULL){
    
    
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
    
    
	SetConsoleOutputCP(65001);
	LinkList L;
	printf("单链表初始化:\n");
	InitList(L);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("单链表插入元素:\n");
	ListInsert(L,1,10);
	ListInsert(L,2,20);
	ListInsert(L,3,30);
	ListInsert(L,4,40);
	ListInsert(L,5,50);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("单链表删除元素:\n");
	int i=2;
	ElemType e;
	ListDelete(L,i,e);
	printf("单链表删除在第%d位值为%d的元素:\n",i,e);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	return 0;
}

输出结果如下:

单链表初始化:
单链表长度为:0
单链表元素为空。
单链表插入元素:
单链表长度为:5
data[0]=10
data[1]=20
data[2]=30
data[3]=40
data[4]=50
单链表删除元素:
单链表删除在第2位值为20的元素:
单链表长度为:4
data[0]=10
data[1]=30
data[2]=40
data[3]=50

2.11单链表–按位查找元素

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//单链表结构体的定义
typedef struct LNode{
    
    
	ElemType 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;
}

//单链表判断是否为空
bool Empty(LinkList L){
    
    
	return (L->next==NULL);
}

//单链表插入元素(按位序插入)
bool ListInsert(LinkList &L,int i,ElemType e){
    
    
	if (i<1)
		return false;
	LNode *p;
	int j=0;
	p=L;
	while (p!=NULL && j<i-1){
    
    
		p=p->next;
		j++;
	}
	if (p==NULL)
		return false;
	LNode *s=(LNode *)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return true;
}

//按位查找元素
int 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->data;
}

//单链表长度计算
int Length(LinkList L){
    
    
	int len=0;
	LNode *p=L;
	while(p->next!=NULL){
    
    
		p=p->next;
		len++;
	}
	return len;
}

//单链表打印输出
void PrintList(LinkList L){
    
    
	if (Empty(L)){
    
    
		printf("单链表元素为空。\n");
		return;
	}
	L=L->next;
	int i=0;
	while (L!=NULL){
    
    
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
    
    
	SetConsoleOutputCP(65001);
	LinkList L;
	printf("单链表初始化:\n");
	InitList(L);
    printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("单链表插入元素:\n");
	ListInsert(L,1,10);
	ListInsert(L,2,20);
	ListInsert(L,3,30);
	ListInsert(L,4,40);
	ListInsert(L,5,50);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	int i=3;
	printf("按位查找链表第%d位的元素值为:%d\n",i,GetElem(L,i));
	return 0;
}

输出结果如下:

单链表初始化:
单链表长度为:0
单链表元素为空。
单链表插入元素:
单链表长度为:5
data[0]=10
data[1]=20
data[2]=30
data[3]=40
data[4]=50
按位查找链表第3位的元素值为:30

2.12单链表–按值查找元素

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//单链表结构体的定义
typedef struct LNode{
    
    
	ElemType 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;
}

//单链表判断是否为空
bool Empty(LinkList L){
    
    
	return (L->next==NULL);
}

//单链表插入元素(按位序插入)
bool ListInsert(LinkList &L,int i,ElemType e){
    
    
	if (i<1)
		return false;
	LNode *p;
	int j=0;
	p=L;
	while (p!=NULL && j<i-1){
    
    
		p=p->next;
		j++;
	}
	if (p==NULL)
		return false;
	LNode *s=(LNode *)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return true;
}

//按值查找元素
int LocateElem(LinkList L,ElemType e){
    
    
	LNode *p=L->next;
	int i=1;
	while (p!=NULL&&p->data!=e){
    
    
		p=p->next;
		i++;
	}
	if (p){
    
    
		return i;
	}
	else{
    
    
		return -1;		
	}	

}

//单链表长度计算
int Length(LinkList L){
    
    
	int len=0;
	LNode *p=L;
	while(p->next!=NULL){
    
    
		p=p->next;
		len++;
	}
	return len;
}

//单链表打印输出
void PrintList(LinkList L){
    
    
	if (Empty(L)){
    
    
		printf("单链表元素为空。\n");
		return;
	}
	L=L->next;
	int i=0;
	while (L!=NULL){
    
    
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
    
    
	SetConsoleOutputCP(65001);
	LinkList L;
	printf("单链表初始化:\n");
	InitList(L);
    printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("单链表插入元素:\n");
	ListInsert(L,1,10);
	ListInsert(L,2,20);
	ListInsert(L,3,30);
	ListInsert(L,4,40);
	ListInsert(L,5,50);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	int e=30;
	printf("按值查找链表值为%d的元素在第%d位\n",e,LocateElem(L,e));
	return 0;
}

输出结果如下:

单链表初始化:
单链表长度为:0
单链表元素为空。
单链表插入元素:
单链表长度为:5
data[0]=10
data[1]=20
data[2]=30
data[3]=40
data[4]=50
按值查找链表值为30的元素在第3位

2.13单链表–头插法创建单链表

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//单链表结构体的定义
typedef struct LNode{
	ElemType 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;
}

//单链表判断是否为空
bool Empty(LinkList L){
	return (L->next==NULL);
}

//头插法建立单链表
LinkList ListHeadInsert(LinkList &L){
	LNode *s;
	int x;
	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;
}

//单链表长度计算
int Length(LinkList L){
	int len=0;
	LNode *p=L;
	while(p->next!=NULL){
		p=p->next;
		len++;
	}
	return len;
}

//单链表打印输出
void PrintList(LinkList L){
	if (Empty(L)){
		printf("单链表元素为空。\n");
		return;
	}
	L=L->next;
	int i=0;
	while (L!=NULL){
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
	SetConsoleOutputCP(65001);
	LinkList L;
	printf("单链表初始化:\n");
	InitList(L);
    printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("请输入单链表需要插入的元素(以回车键间隔每个元素,直至输入9999结束元素的插入):\n");
	ListHeadInsert(L);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	return 0;
}

输出结果如下:

单链表初始化:
单链表长度为:0
单链表元素为空。
请输入单链表需要插入的元素(以回车键间隔每个元素,直至输入9999结束元素的插入):
1
2
3
4
5
9999
单链表长度为:5
data[0]=5
data[1]=4
data[2]=3
data[3]=2
data[4]=1

2.14单链表–尾插法创建单链表

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//单链表结构体的定义
typedef struct LNode{
	ElemType 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;
}

//单链表判断是否为空
bool Empty(LinkList L){
	return (L->next==NULL);
}

//尾插法创建单链表
LinkList List_TailInsert(LinkList &L){
	int x;
	L=(LinkList)malloc(sizeof(LNode));
	LNode *s,*r=L;
	scanf("%d",&x);
	while(x!=9999){
		s=(LNode *)malloc(sizeof(LNode));
		s->data=x;
		r->next=s;
		r=s;
		scanf("%d",&x);
	}
	r->next=NULL;
	return L;
}

//单链表长度计算
int Length(LinkList L){
	int len=0;
	LNode *p=L;
	while(p->next!=NULL){
		p=p->next;
		len++;
	}
	return len;
}

//单链表打印输出
void PrintList(LinkList L){
	if (Empty(L)){
		printf("单链表元素为空。\n");
		return;
	}
	L=L->next;
	int i=0;
	while (L!=NULL){
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
	SetConsoleOutputCP(65001);
	LinkList L;
	printf("单链表初始化:\n");
	InitList(L);
    printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("请输入单链表需要插入的元素(以回车键间隔每个元素,直至输入9999结束元素的插入):\n");
	List_TailInsert(L);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	return 0;
}

输出结果如下:

单链表初始化:
单链表长度为:0
单链表元素为空。
请输入单链表需要插入的元素(以回车键间隔每个元素,直至输入9999结束元素的插入):
1
2
3
4
5
9999
单链表长度为:5
data[0]=1
data[1]=2
data[2]=3
data[3]=4
data[4]=5

2.15单链表–单链表逆置

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//单链表结构体的定义
typedef struct LNode{
	ElemType 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;
}

//单链表判断是否为空
bool Empty(LinkList L){
	return (L->next==NULL);
}

//头插法建立单链表
LinkList ListHeadInsert(LinkList &L){
	LNode *s;
	int x;
	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;
}

//单链表的逆置
LinkList ListInversion(LinkList &L){
	LNode *p,*q;
	p=L->next;
	L->next=NULL;
	while(p!=NULL){
		q=p;
		p=p->next;
		q->next=L->next;
		L->next=q;
	}
	return L;
}

//单链表长度计算
int Length(LinkList L){
	int len=0;
	LNode *p=L;
	while(p->next!=NULL){
		p=p->next;
		len++;
	}
	return len;
}

//单链表打印输出
void PrintList(LinkList L){
	if (Empty(L)){
		printf("单链表元素为空。\n");
		return;
	}
	L=L->next;
	int i=0;
	while (L!=NULL){
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
	SetConsoleOutputCP(65001);
	LinkList L;
	printf("单链表初始化:\n");
	InitList(L);
    printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("请输入单链表需要插入的元素(以回车键间隔每个元素,直至输入9999结束元素的插入):\n");
	ListHeadInsert(L);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("单链表的逆置:\n");
	ListInversion(L);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);	
	return 0;
}

输出结果如下:

单链表初始化:
单链表长度为:0
单链表元素为空。
请输入单链表需要插入的元素(以回车键间隔每个元素,直至输入9999结束元素的插入):
1
2
3
4
5
9999
单链表长度为:5
data[0]=5
data[1]=4
data[2]=3
data[3]=2
data[4]=1
单链表的逆置:
单链表长度为:5
data[0]=1
data[1]=2
data[2]=3
data[3]=4
data[4]=5

3.双链表

3.1双链表–尾插法插入元素

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//双链表结构体的定义
typedef struct DNode{
	ElemType data;
	struct DNode *prior,*next;
}DNode,*DLinkList;

//双链表初始化
bool InitDLinkList(DLinkList &L){
	L=(DNode *)malloc(sizeof(DNode));
	if (L==NULL)
		return false;
	L->prior=NULL;
	L->next=NULL;
	return true;
}

//双链表的插入(后插法:在最后的结点p插入一个新的结点s)
bool InsertNextDNode(DNode *p,int x){
	while (p->next!=NULL){
		p=p->next;
	}
	DNode *s;
	s=(DNode *)malloc(sizeof(DNode));
	s->data=x;
	if (p==NULL || s==NULL)
		return false;
	s->next=p->next;
	if (p->next!=NULL)
		p->next->prior=s;
	s->prior=p;
	p->next=s;
	return true;
}

//双链表判断是否为空
bool Empty(DLinkList L){
	if (L->next==NULL)
		return true;
	else
		return false;
}

//双链表长度计算
int Length(DLinkList L){
	int len=0;
	DNode *p=L;
	while(p->next!=NULL){
		p=p->next;
		len++;
	}
	return len;
}

//双链表打印输出
void PrintList(DLinkList L){
	if (Empty(L)){
		printf("双链表元素为空。\n");
		return;
	}
	L=L->next;
	int i=0;
	while (L!=NULL){
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
	SetConsoleOutputCP(65001);
	DLinkList L;
	printf("双链表初始化:\n");
	InitDLinkList(L);
	printf("双链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("双链表插入元素:\n");
	InsertNextDNode(L,1);
	InsertNextDNode(L,2);
	InsertNextDNode(L,3);
	InsertNextDNode(L,4);
	InsertNextDNode(L,5);	
	printf("双链表长度为:%d\n",Length(L));
	PrintList(L);	
	return 0;
}

输出结果如下:

双链表初始化:
双链表长度为:0
双链表元素为空。
双链表插入元素:
双链表长度为:5
data[0]=1
data[1]=2
data[2]=3
data[3]=4
data[4]=5

3.2双链表–尾删法删除元素

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//双链表结构体的定义
typedef struct DNode{
	ElemType data;
	struct DNode *prior,*next;
}DNode,*DLinkList;

//双链表初始化
bool InitDLinkList(DLinkList &L){
	L=(DNode *)malloc(sizeof(DNode));
	if (L==NULL)
		return false;
	L->prior=NULL;
	L->next=NULL;
	return true;
}

//双链表的插入(后插法:在最后的结点p插入一个新的结点s)
bool InsertNextDNode(DNode *p,int x){
	while (p->next!=NULL){
		p=p->next;
	}
	DNode *s;
	s=(DNode *)malloc(sizeof(DNode));
	s->data=x;
	if (p==NULL || s==NULL)
		return false;
	s->next=p->next;
	if (p->next!=NULL)
		p->next->prior=s;
	s->prior=p;
	p->next=s;
	return true;
}

//双链表的删除(后删法:删除结点p的后继结点q)
bool DeleteNextDNode(DNode *p){
	while (p->next!=NULL){
		p=p->next;
	}
	p=p->prior;
	if (p==NULL)
		return false;
	DNode *q=p->next;
	if (q==NULL)
		return false;
	p->next=q->next;
	if (q->next!=NULL)
		q->next->prior=p;
	free(q);
	return true;
}

//删除整个双链表
void DestoryList(DLinkList L){
	while (L->next!=NULL){
		DeleteNextDNode(L);
	}
	free(L);
	L=NULL;
}

//双链表判断是否为空
bool Empty(DLinkList L){
	if (L->next==NULL)
		return true;
	else
		return false;
}

//双链表长度计算
int Length(DLinkList L){
	int len=0;
	DNode *p=L;
	while(p->next!=NULL){
		p=p->next;
		len++;
	}
	return len;
}

//双链表打印输出
void PrintList(DLinkList L){
	if (Empty(L)){
		printf("双链表元素为空。\n");
		return;
	}
	L=L->next;
	int i=0;
	while (L!=NULL){
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
	SetConsoleOutputCP(65001);
	DLinkList L;
	printf("双链表初始化:\n");
	InitDLinkList(L);
	printf("双链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("双链表插入元素:\n");
	InsertNextDNode(L,1);
	InsertNextDNode(L,2);
	InsertNextDNode(L,3);
	InsertNextDNode(L,4);
	InsertNextDNode(L,5);	
	printf("双链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("双链表删除元素:\n");
	DeleteNextDNode(L);
	printf("双链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("删除整个双链表:\n");
	DestoryList(L);
	printf("双链表长度为:%d\n",Length(L));
	PrintList(L);	
	return 0;
}

输出结果如下:

双链表初始化:
双链表长度为:0
双链表元素为空。
双链表插入元素:
双链表长度为:5
data[0]=1
data[1]=2
data[2]=3
data[3]=4
data[4]=5
双链表删除元素:
双链表长度为:4
data[0]=1
data[1]=2
data[2]=3
data[3]=4
删除整个双链表:
双链表长度为:0
双链表元素为空。

4.循环链表

4.1循环单链表

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//单链表结构体的定义
typedef struct LNode{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;

//单链表初始化
bool InitList(LinkList &L){
	L=(LNode *)malloc(sizeof(LNode));
	if (L==NULL)
		return false;
	L->next=L;
	return true;
}

//尾插法创建单链表
LinkList List_TailInsert(LinkList &L,int x){
	LNode *p=L;
	while (p->next!=L){
		p=p->next;
	}
	LNode *s=(LNode *)malloc(sizeof(LNode));
	s->data=x;
	s->next=p->next;
	p->next=s;
	p=p->next;
	return L;	
}

//单链表判断是否为空
bool Empty(LinkList L){
	if (L->next==L)
		return true;
	else
		return false;
}

//判断结点p是否为循环单链表的表尾结点
bool isTail(LinkList L,LNode *p){
	if (p->next==L)
		return true;
	else
		return false;
}

//单链表长度计
int Length(LinkList L){
	int len=0;
	LNode *p=L;
	while(p->next!=L){
		p=p->next;
		len++;
	}
	return len;
}

//单链表打印输出
void PrintList(LinkList L){
	if (Empty(L)){
		printf("单链表元素为空。\n");
		return;
	}
	L=L->next;
	int i=0;
	LNode *p;
	while (isTail(L,p)!=true){
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
	SetConsoleOutputCP(65001);
	LinkList L;
	LNode* p=L;
	printf("单链表初始化:\n");
	InitList(L);
    printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("单链表插入元素:\n");
	List_TailInsert(L,1);
	List_TailInsert(L,2);
	List_TailInsert(L,3);
	List_TailInsert(L,4);
	List_TailInsert(L,5);
	printf("单链表长度为:%d\n",Length(L));
	PrintList(L);
	return 0;	
}

输出结果如下:

单链表初始化:
单链表长度为:0
单链表元素为空。
单链表插入元素:
单链表长度为:5
data[0]=1
data[1]=2
data[2]=3
data[3]=4
data[4]=5

4.2循环双链表

#include <windows.h>
#include <stdio.h>

typedef int ElemType;

//双链表结构体的定义
typedef struct DNode{
	ElemType data;
	struct DNode *prior,*next;
}DNode,*DLinkList;

//双链表初始化
bool InitDLinkList(DLinkList &L){
	L=(DNode *)malloc(sizeof(DNode));
	if (L==NULL)
		return false;
	L->prior=L;
	L->next=L;
	return true;
}

//尾插法创建双链表
DLinkList List_TailInsert(DLinkList &L,int x){
	DNode *p=L;
	while (p->next!=L){
		p=p->next;
	}
	DNode *s;
	s=(DNode *)malloc(sizeof(DNode));
	s->data=x;
	s->next=p->next;
	p->next->prior=s;
	s->prior=p;
	p->next=s;
	return L;
}

//双链表判断是否为空
bool Empty(DLinkList L){
	if (L->next==L)
		return true;
	else
		return false;
}

//判断结点p是否为循环双链表的表尾结点
bool isTail(DLinkList L,DNode *p){
	if (p->next==L)
		return true;
	else
		return false;
}

//双链表长度计算
int Length(DLinkList L){
	int len=0;
	DNode *p=L;
	while(p->next!=L){
		p=p->next;
		len++;
	}
	return len;
}

//双链表打印输出
void PrintList(DLinkList L){
	if (Empty(L)){
		printf("双链表元素为空。\n");
		return;
	}
	L=L->next;
	int i=0;
	DNode *p;
	while (isTail(L,p)!=true){
		printf("data[%d]=%d\n",i,L->data);
		L=L->next;
		i++;
	}
}

int main(){
	SetConsoleOutputCP(65001);
	DLinkList L;
	printf("双链表初始化:\n");
	InitDLinkList(L);
	printf("双链表长度为:%d\n",Length(L));
	PrintList(L);
	printf("双链表插入元素:\n");
	List_TailInsert(L,1);
	List_TailInsert(L,2);
	List_TailInsert(L,3);
	List_TailInsert(L,4);
	List_TailInsert(L,5);	
	printf("双链表长度为:%d\n",Length(L));
	PrintList(L);	
	return 0;
}

输出结果如下:

双链表初始化:
双链表长度为:0
双链表元素为空。
双链表插入元素:
双链表长度为:5
data[0]=1
data[1]=2
data[2]=3
data[3]=4
data[4]=5

猜你喜欢

转载自blog.csdn.net/m0_67790374/article/details/128316346