C语言 链表的增删改查

题目:利用C或C++语言实现一个长度为N的int型单链表,包括链表的定义、建立、指定位置增减以及长度查询等操作。

#include<stdio.h>
#include<stdlib.h>
#define N 10

struct Link
{
	int data;
	struct Link *next;
};
int length = 0;	// 用来存放链表长度

/**
 * head: 数据链表
 * index: 插入的位置
 * data: 插入的数据
 **/
struct Link *insertLink(Link *head, int index, int data) {
	struct Link *p = NULL, *pr = head;
	p = (struct Link*)malloc(sizeof(struct Link));
	if (p == NULL)
	{
		printf("内存分配失败!\n");
		exit(0);
	}
	p->data = data;
	p->next = NULL;
	if (index == 0) {// 首部插入即可
		p->next = pr;
		head = p;
	}
	else if (index == length - 1) {// 尾部插入
		while (pr->next != NULL)
		{
			pr = pr->next;
		}
		pr->next = p;
	}
	else {// 中间插入
		int index_temp = 0;// 循环计数
		Link *pre = NULL;
		while (index_temp != index)
		{
			index_temp++;
			if (index_temp == index) pre = pr;
			pr = pr->next;
		}
		pre->next = p;
		p->next = pr;
	}
	length++;
	return head;
}

/**
 * head: 数据链表
 * index: 删除的位置
 **/
struct Link *deleteLink(Link *head, int index) {
	if (length == 0) return head;
	struct Link *p = head, *pr = head;// 快慢指针的思路
	if (index == 0) {// 删除首个元素
		pr = pr->next;
		head = pr;
	}
	else {// 删除其它位置的元素
		int index_temp = 0;// 循环计数
		while (index_temp != index) {
			if (index_temp > 0) p = p->next;
			pr = pr->next;
			index_temp++;
		}
		p->next = pr->next;
	}
	length--;
	return head;
}

/**
 * 获取用户输入的数字
 * content: 用于控制台中提示的字符串
 */
int getInput(const char *content) {
	int input = -1;
	printf("%s", content);
	scanf("%d", &input);
	return input;
}

/**
 * 展示链表所有数据
 * head: 链表
 **/
void showLink(Link *head) {
	struct Link *p = head;
	while (p != NULL)
	{
		printf("%d ->", p->data);
		p = p->next;
	}
	printf("\n");// 换行
}

// 新增数据 - 逻辑代码
struct Link *stepOne(Link *head) {
	int index = getInput("请输入要插入的位置(负数默认插入在首部,大于链表长度则插入到尾部,规则与数组索引相似):\n");
	int data = getInput("请输入要插入的数据:\n");
	if (index < 0 || length == 0) {
		// 插入到首部
		head = insertLink(head, 0, data);
	}
	else if (index >= length - 1) {
		// 插入到尾部
		head  = insertLink(head , length, data);
	}
	else {
		// 插入到 index 位置
		head = insertLink(head, index, data);
	}
	printf("-------------------------------------------------------------------------------------\n");
	return head;
}

// 删除数据 - 逻辑代码
struct Link *stepTwo(Link *head) {
	int index = getInput("请输入要删除的位置(负数默认删除首个元素,大于链表长度则删除尾部):\n");
	if (index < 0) {
		head = deleteLink(head, 0);
	}
	else if (index >= length - 1) {
		head = deleteLink(head, length - 1);
	}
	else {
		head = deleteLink(head, index);
	}
	printf("-------------------------------------------------------------------------------------\n");
	return head;
}

// 查看长度 - 逻辑代码
void  stepThree(Link *head) {
	printf("链表长度为: %d\n", length);
	printf("-------------------------------------------------------------------------------------\n");
}

// 显示数据 - 逻辑代码
void stepFour(Link *head) {
	showLink(head);
	printf("-------------------------------------------------------------------------------------\n");
}

// 主函数 - 流程代码
int main() {
	struct Link *head = NULL;
	const char *menuContent = "请输入数字来选择下列选项:\n1.新增数据\t2.删除数据\t3.查看链表长度\t4.显示链表数据\t5.结束程序\n";
	while (1) {
		int input = getInput(menuContent);
		switch (input)
		{
		case 1:
			printf("选择了新增数据\n");
			head = stepOne(head);
			break;
		case 2:
			printf("选择了删除数据\n");
			head = stepTwo(head);
			break;
		case 3:
			stepThree(head);
			break;
		case 4:
			stepFour(head);
			break;
		case 5:
			return 0;
		default:
			break;
		}
	}
	return 0;
}

有任何bug或者建议请评论区留言~

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值