单链表的基本操作——C语言编写

此单链表的功能有 判断是否为空表、清空单链表、销毁单链表、插入数据、删除数据、查找单链表中的数据。

以下是代码段

//单链表
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
#define OK 1
#define ERROR  0
#define OVERLOW 0
typedef int Status;

typedef struct {
	int number[80];
}ElemType;

typedef struct LNode {
	ElemType data;
	struct LNode* next;
	Status length;
}LNode, * LinkList;

//初始化链表
Status InitList_L(LinkList& L) {
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	return OK;
}

//判断链表是否为空表
int ListElempty_L(LinkList L) {
	if (L->next == NULL) {
		printf("此表是空表\n");
		return OK;
	}
	else {
		printf("此表不是空表\n");
		return 0;
	}
}

//销毁链表
Status DestroyList_L(LinkList& L) {
	//创建一个链表p
	LinkList p;
	//当L不为空的时候执行下面步骤
	while (L) {
		//L赋给p,依次释放掉
		p = L;
		L = L->next;
		free(p);
	}
	printf("销毁单链表操作成功!\n");
	return OK;
}

//清空链表
Status ClearList_L(LinkList& L) {
	LinkList p;
	LinkList q;
	p = L->next;
	while (p) {
		q = p->next;
		free(p);
		p = q;
	}
	L->next = NULL;
	printf("清空单链表操作成功!\n");
	return OK;
}

//求链表的长度
Status ListLength(LinkList L) {
	int number = 0;
	LinkList p;
	p = L->next;
	while (p) {
		p = p->next;
		number++;
	}
	printf("此链表的长度是%d\n", number);
	return OK;
}

//得到链表中的一个元素
Status GetElem_L(LinkList& L, int i, ElemType& e) {
	LinkList p;
	p = L->next;
	int j = 1;
	while (p && j < i) {
		p = p->next;
		j++;
	}
	if (!p|| j > i) {
		printf("此链表为空表,取不到链表中元素\n");
		return ERROR;
	}
	e = p->data;
	printf("取得链表的元素是%d\n", e);
	return OK;
}

//删除链表中的一个元素
Status ListDelete(LinkList& L, int i, ElemType& e) {
	LinkList p;
	LinkList q;
	p = L;

	int j = 0;
	while (p && j < i - 1) {
		p = p->next;
		j++;
	}
	if (!p || j > i - 1) {
		return ERROR;
	}
	q = p->next;
	e = q->data;
	p->next = q->next;
	free(q);
	return OK;
}

//插入元素
Status ListInsert_L(LinkList& L, int i, ElemType e) {
	LinkList p;
	LinkList q;
	p = L;
	int j = 0;
	while (p && j < i - 1) {
		p = p->next;
		j++;
	}
	if (!p || j > i - 1) {
		return ERROR;
	}
	q = (LinkList)malloc(sizeof(LNode));
	q->data = e;
	q->next = p->next;
	p->next = q;
	return OK;
}

//链表头插法
Status CreateListHead_L(LinkList& L, int i) {
	L = (LinkList)malloc(sizeof(LNode));
	LinkList p;
	L->next = NULL;
	for (int n = i; n > 0; n--) {
		p = (LinkList)malloc(sizeof(LNode));
		printf("请输入要插入的数:\n");
		scanf("%d", &p->data);
		p->next = L->next;
		L->next = p;
	}
	return OK;
}

//链表尾插法
Status CreateListTail_L(LinkList& L, int i) {
	L = (LinkList)malloc(sizeof(LNode));
	LinkList r;
	LinkList p;
	L->next = NULL;
	r = L;
	for (int n = i; n > 0; n--) {
		p = (LinkList)malloc(sizeof(LNode));
		printf("请输入要插入的数:\n");
		scanf("%d", &p->data);
		r->next = p;
		r = p;
	}
	r->next = NULL;
	return OK;
}

//输出单链表中的值
Status printData_L(LinkList& L) {
	LinkList p;
	p = L->next;
	while (p) {
		printf("%5d", p->data);
		p = p->next;
	}
	printf("\n");
	return OK;
}
int main() {
	LinkList L;
	InitList_L(L);
	while (true) {
		printf("*******************单链表操作功能******************\n");
		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("***************************************************\n");

		int operateNumber;
		printf("请输入要操作的数字:\n");
		scanf("%d", &operateNumber);

		switch (operateNumber) {
		case 1:
			ListElempty_L(L);
			break;
		case 2:
			//尾插法插入元素
			int number;
			printf("请输入要插入几个元素:\n");
			scanf("%d", &number);
			CreateListTail_L(L, number);
			//输出元素
			printData_L(L);
			break;
		case 3:
			//求单链表的长度
			ListLength(L);
			break;
		case 4:
			//清空单链表
			ClearList_L(L);
			break;
		case 5:
			//销毁单链表
			DestroyList_L(L);
			break;
		case 6:
			//在链表中指定一个位置插入元素
			int pos;
			printf("请输入插入的位置:\n");
			scanf("%d", &pos);
			ElemType num;
			printf("请输入插入的元素:\n");
			scanf("%d", &num);
			ListInsert_L(L, pos, num);
			//输出元素
			printData_L(L);
			break;
		case 7:
			//在链表中指定一个位置删除元素
			ElemType ee;
			int deletePosition;
			printf("请输入删除的位置:\n");
			scanf("%d", &deletePosition);
			ListDelete(L, deletePosition, ee);
			printData_L(L);
			break;

		case 8:
			//得到链表中的一个元素
			int position;
			printf("请输入想要得到链表中第几个位置的元素:\n");
			scanf("%d", &position);
			ElemType getData;
			GetElem_L(  L,  position,  getData);
			break;
		case 9:
			printf("你已经退出单链表操作了");
			exit(0);
			break;
		default:
			printf("你输出的数字有误请重新输入:\n");
			break;
		}
	}
	system("pause");
	return 0;
}

下面是功能演示:

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是语呀-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值