【数据结构】——单链表的各功能实现

【数据结构】——单链表的各功能实现

花了一些时间将单链表实现了一遍,基本涵盖了单链表的所有功能与算法,先上代码,写实验报告的同学可以直接白嫖。
具体功能如下:
在这里插入图片描述

这个是带头结点的单链表

#include <cstdio>
#include <cstdlib>

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;
}

bool Empty(LinkList L){
	if(L->next == NULL){
		return true;
	}
	return false;
}

bool ListInsert(LinkList &L, int i, int 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 ListPriorInsert(LinkList &L, int i, int e){
	if(i<2){
		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->next = p->next;
	p->next = s;
	s->data = p->data;
	p->data = e;
	return true;
}

bool ListDelete(LinkList &L, int i, int &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 *q = p->next;
	e = q->data;
	p->next = q->next;
	free(q); 
	return true;
}

bool NodeDelete(LinkList &L, int i, int &e){
	if(i<1){
		return false;
	}
	LNode *p;
	int j=0;
	p = L;
	while(p!=NULL && j<i){
		p=p->next;
		j++;
	}
	if(p==NULL){
		return false;
	}
	LNode *q = p->next;
	e = p->data;
	p->data = q->data;
	p->next = q->next;
	free(q);
	return true;
}

bool GetElem(LinkList L, int loc, int &data){
	if(loc <= 0){
		return false;
	}
	LNode *p;
	int j=0;
	p = L;
	while(p!=NULL && j<loc){
		p=p->next;
		j++;
	}
	if(p == NULL){
		return false;
	}
	data = p->data;
	return true;
}

bool LocateElem(LinkList L, int &loc, int data){
	LNode *p = L->next;
	int j=1;
	while(p!=NULL && p->data!=data){
		p=p->next;
		j++;
	}
	if(p == NULL){
		return false;
	}
	loc = j;
	return true;
}

int Length(LinkList L){
	int j=0;
	LNode *p = L;
	while(p->next != NULL){
		p = p->next;
		j++;
	}
	return j;
}

bool InitList_TailInsert(LinkList &L){
	int x;
	L = (LinkList)malloc(sizeof(LNode));
	if(L == NULL){
		return false;
	}
	L->next = NULL;
	LNode *s,*r = L;
	printf("请输入结点的值(输入9999结束):");
	scanf("%d", &x);
	while(x != 9999){
		s = (LNode *)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r = s;
		printf("请输入结点的值(输入9999结束):");
		scanf("%d", &x);
	}
	r->next = NULL;
	return true;
}

bool InitList_HeadInsert(LinkList &L){
	int x;
	L = (LinkList)malloc(sizeof(LNode));
	if(L == NULL){
		return false;
	}
	L->next = NULL;
	LNode *s;
	printf("请输入结点的值(输入9999结束):");
	scanf("%d", &x);
	while(x != 9999){
		s = (LNode *)malloc(sizeof(LNode));
		s->data = x;
		s->next = L->next;
		L->next = s;
		printf("请输入结点的值(输入9999结束):");
		scanf("%d", &x);
	}
	return true;
}

void ListShow(LinkList L){
	L = L->next;
	while(L != NULL){
		printf("%d->", L->data);
		L = L->next;
	}
	printf("NULL\n\n");
}

void menu(){
	printf("1、创建带头结点空的单链表\n");
	printf("2、尾插法创建带头结点的单链表\n");
	printf("3、头插法创建带头结点的单链表\n");
	printf("4、链表是否为空\n");
	printf("5、插入结点\n");
	printf("6、指定结点前插入\n");
	printf("7、按位序删除\n");
	printf("8、指定结点删除\n");
	printf("9、按位查找元素\n");
	printf("10、按值查找\n");
	printf("11、表的长度\n");
	printf("12、显示链表\n");
	printf("13、退出\n");
}
int main(){
	int n;
	LinkList L;
	while(1){
		menu();
		printf("请选择:");
		scanf("%d", &n);
		switch(n){
			case 1:{
				if(InitList(L)){
					printf("创建成功\n\n");
				}else{
					printf("创建失败\n\n");
				};
				break;
			}
			case 2:{
				if(InitList_TailInsert(L)){
					printf("创建成功\n\n");
				}else{
					printf("创建失败\n\n");
				};
				break;
			}
			case 3:{
				if(InitList_HeadInsert(L)){
					printf("创建成功\n\n");
				}else{
					printf("创建失败\n\n");
				};
				break;
			}
			case 4:{
				if(Empty(L)){
					printf("链表为空\n\n");
				}else{
					printf("链表不为空\n\n");
				}
				break;
			}
			case 5:{
				printf("请输入需要插入结点的位置:");
				int loc;
				scanf("%d", &loc);
				printf("请输入需要插入结点的数据:");
				int data;
				scanf("%d", &data);
				if(ListInsert(L, loc, data)){
					printf("插入成功!\n\n");
				}else{
					printf("插入失败!\n\n");
				}
				break;
			} 
			case 6:{
				printf("请输入要在哪个位置之前插入:");
				int loc;
				scanf("%d", &loc);
				printf("请输入插入的数据:");
				int data;
				scanf("%d", &data);
				if(ListPriorInsert(L, loc, data)){
					printf("插入成功!\n\n");
				}else{
					printf("插入失败!\n\n");
				}
				break;
			} 
			case 7:{
				printf("请输入要删除哪个位置结点:");
				int loc;
				int data;
				scanf("%d", &loc);
				if(ListDelete(L, loc, data)){
					printf("删除元素%d成功!\n\n", data);
				}else{
					printf("删除失败!\n\n");
				}
				break;
			} 
			case 8:{
				printf("请输入要删除哪个位置结点:");
				int loc;
				int data;
				scanf("%d", &loc);
				if(NodeDelete(L, loc, data)){
					printf("删除元素%d成功!\n\n", data);
				}else{
					printf("删除失败!\n\n");
				}
				break;
			} 
			case 9:{
				printf("请输入要查找的位置:");
				int loc;
				int data;
				scanf("%d", &loc);
				if(GetElem(L, loc, data)){
					printf("查找到的元素为%d!\n\n", data);
				}else{
					printf("查找失败!\n\n");
				}
				break;
			}
			case 10:{
				printf("请输入要查找的值:");
				int loc;
				int data;
				scanf("%d", &data);
				if(LocateElem(L, loc, data)){
					printf("查找元素的位置为%d!\n\n", loc);
				}else{
					printf("查找失败!\n\n");
				}
				break;
			}
			case 11:{
				printf("表的长度为:%d\n\n", Length(L));
				break;
			}
			case 12:{
				ListShow(L);
				break;
			}
			case 13:{
				exit(0);
				break;
			}
		}
	}
	
	return 0;
} 

这个是不带头结点的单链表,由于考研很少会考,所以仅实现了少量功能

#include <cstdio>
#include <cstdlib>

typedef struct LNode{
	int data;
	struct LNode *next;
}LNode, *LinkList;

bool InitList(LinkList &L){
	L = NULL;
	return true;
}

bool Empty(LinkList L){
	if(L == NULL){
		return true;
	}
	return false;
}

bool ListInsert(LinkList &L, int i, int 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;
}

void ListShow(LinkList L){
	while(L != NULL){
		printf("%d->", L->data);
		L = L->next;
	}
	printf("NULL\n\n");
}

void menu(){
	printf("1、创建不带头结点链表\n");
	printf("2、链表是否为空\n");
	printf("3、插入结点\n");
	printf("4、显示链表\n");
}
int main(){
	int n;
	LinkList L;
	while(1){
		menu();
		scanf("%d", &n);
		switch(n){
			case 1:{
				if(InitList(L)){
					printf("创建成功\n\n");
				}else{
					printf("创建失败\n\n");
				};
				break;
			}
			case 2:{
				if(Empty(L)){
					printf("链表为空\n\n");
				}else{
					printf("链表不为空\n\n");
				}
				break;
			}
			case 3:{
				printf("请输入需要插入结点的位置:");
				int loc;
				scanf("%d", &loc);
				printf("请输入需要插入结点的数据:");
				int data;
				scanf("%d", &data);
				if(ListInsert(L, loc, data)){
					printf("插入成功!\n\n");
				}else{
					printf("插入失败!\n\n");
				}
				break;
			} 
			case 4:{
				ListShow(L);
				break;
			}
		}
	}
	
	return 0;
} 

下面是各个功能的具体函数实现
创建带头结点空的单链表

bool InitList(LinkList &L){
	L = (LNode *)malloc(sizeof(LNode));
	if(L == NULL){
		return false;
	}
	L->next = NULL;
	return true;
}

尾插法创建带头结点的单链表

bool InitList_TailInsert(LinkList &L){
	int x;
	L = (LinkList)malloc(sizeof(LNode));
	if(L == NULL){
		return false;
	}
	L->next = NULL;
	LNode *s,*r = L;
	printf("请输入结点的值(输入9999结束):");
	scanf("%d", &x);
	while(x != 9999){
		s = (LNode *)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r = s;
		printf("请输入结点的值(输入9999结束):");
		scanf("%d", &x);
	}
	r->next = NULL;
	return true;
}

头插法创建带头结点的单链表

bool InitList_HeadInsert(LinkList &L){
	int x;
	L = (LinkList)malloc(sizeof(LNode));
	if(L == NULL){
		return false;
	}
	L->next = NULL;
	LNode *s;
	printf("请输入结点的值(输入9999结束):");
	scanf("%d", &x);
	while(x != 9999){
		s = (LNode *)malloc(sizeof(LNode));
		s->data = x;
		s->next = L->next;
		L->next = s;
		printf("请输入结点的值(输入9999结束):");
		scanf("%d", &x);
	}
	return true;
}

链表是否为空

bool Empty(LinkList L){
	if(L->next == NULL){
		return true;
	}
	return false;
}

插入结点

bool ListInsert(LinkList &L, int i, int 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 ListPriorInsert(LinkList &L, int i, int e){
	if(i<2){
		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->next = p->next;
	p->next = s;
	s->data = p->data;
	p->data = e;
	return true;
}

按位序删除

bool ListDelete(LinkList &L, int i, int &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 *q = p->next;
	e = q->data;
	p->next = q->next;
	free(q); 
	return true;
}

指定结点删除

bool NodeDelete(LinkList &L, int i, int &e){
	if(i<1){
		return false;
	}
	LNode *p;
	int j=0;
	p = L;
	while(p!=NULL && j<i){
		p=p->next;
		j++;
	}
	if(p==NULL){
		return false;
	}
	LNode *q = p->next;
	e = p->data;
	p->data = q->data;
	p->next = q->next;
	free(q);
	return true;
}

按位查找元素

bool GetElem(LinkList L, int loc, int &data){
	if(loc <= 0){
		return false;
	}
	LNode *p;
	int j=0;
	p = L;
	while(p!=NULL && j<loc){
		p=p->next;
		j++;
	}
	if(p == NULL){
		return false;
	}
	data = p->data;
	return true;
}

按值查找

bool LocateElem(LinkList L, int &loc, int data){
	LNode *p = L->next;
	int j=1;
	while(p!=NULL && p->data!=data){
		p=p->next;
		j++;
	}
	if(p == NULL){
		return false;
	}
	loc = j;
	return true;
}

表的长度

int Length(LinkList L){
	int j=0;
	LNode *p = L;
	while(p->next != NULL){
		p = p->next;
		j++;
	}
	return j;
}

显示链表

void ListShow(LinkList L){
	L = L->next;
	while(L != NULL){
		printf("%d->", L->data);
		L = L->next;
	}
	printf("NULL\n\n");
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值