学习笔记 编写简单有序链表的创建和查询修改

本文介绍如何使用C语言实现一个可管理有序整数的单向链表,包括链表的创建、节点操作(查询、插入、修改、删除)以及内存管理,以确保链表结构的正确性和内存效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任务描述

编写一个简单的单向链表,实现对一组长度不定的有序整数的管理(查询、插入、修改、删除)。

编程要求

(1)创建一个单向链表,其结点包含值(number)和序号(xuhao)两个整型数据字段(序号从1开始递增,相邻两结点的序号相差1,下同), 输出该链表(按顺序从头部开始输出结点的值,相邻结点值之间用一个空格隔开,最后一个结点的值后不包含空格,下同);

(2)输入整数n,输出序号为n的结点的值;

(3)输入整数x,查找第1个值为x的结点,并输出其序号和值;

(4)插入结点: 输入整数 n和整数x,在原链表中序号为n的结点后插入值为x的新结点,然后输出该链表;

(5)删除结点: 输入整数 n,删除序号为 n 的结点,并输出该链表。

(6)对链表的任何修改操作,都必须保证操作后,链表中从第1个结点开始,序号始终是从1开始递增,相邻结点的序号值相差1.

(7)确保及时释放内存(例如,删除一个结点时,删除的结点的内存要及时释放),避免内存泄漏。

(8)充分地利用函数对程序功能进行合理划分与设计,提高程序的可维护性。

测试说明

测试输入

21 3 15 27 11 18 0 3 15 3 33 4

预期输出:

21 3 15 27 11 18 15 3 15 21 3 15 33 27 11 18 21 3 15 27 11 18

上面有关输入输出的解释如下 :

输入第一行:输入一串数据,中间用空格隔开,当输入为0时结束输入 。

输出第一行:将链表中的每个元素输出。

输入第二行:输入要查找的序号3

输出第二行:序号3对应的数据15

输入第三行:要查找的元素15

输出第三行:元素15对应的位置3 ,以及 15这个元素

输入第四行:第一个元素为要插入的位置前一个元素位置3,第二个元素为要插入的数据33

输入第五行:要删除的元素位置4

输出第五行:删除元素后的链表元素再次输出。

代码实现

// 编程完成下列任务
//(1)建立一个单链表 21  3  15  27  11  18,并输出该链表;
//(2)输入序号n,查找序号为n的结点,并输出;
//(3)输入值x,查找值为x的结点,并输出;
//(4)插入结点: 输入序号 n和值x。在序号为n的结点后插入x,并输出该链表;
//(5)删除结点: 输入序号 n,删除序号为 n 的结点,并输出该链表。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define LEN sizeof(struct Nmb)

//创建结点
typedef struct Nmb
{
	int number;
	int xuhao;
	struct Nmb* next;
}Link;

//初始化链表(输入数据)
Link* Creat(const int n,const int *arr)
{
	Link* head = NULL, * node = NULL, * end = NULL;
	head = (Link*)malloc(LEN);
	if (head == NULL)
	{
		printf("%s", strerror(errno));
		return 0;
	}
	end = head;
	for (int i = 1; i <= n; i++)
	{
		node = (Link*)malloc(LEN);
		if (node == NULL)
		{
			printf("%s", strerror(errno));
			return 0;
		}
		node->number = arr[i - 1];
		node->xuhao = i;
		end->next = node;
		end = node;
	}
	end->next = NULL;
	return head;
}

//输出链表
void Output(const Link* head)
{
	int i=0;
	while (head->next != NULL)
	{
		head = head->next;
		printf("%d", head->number);
		if(head->next != NULL)
      	printf(" ");
		
	}
	printf("\n");
}

//查找序号
int SreachS(const Link* head, const int n)
{
	int det = 0;
	while (head->next != NULL)
	{
		if (head->xuhao == n)
		{
			det = head->number;
			break;
		}
		head = head->next;
	}
	return det;
}

//查找元素
void SearchN(const Link* head,const int n)
{
	int detS = 0;
	while (head->next != NULL)
	{
		if (head->number == n)
		{
			detS = head->xuhao;
			break;
		}
		head = head->next;
	}
	printf("%d %d\n", detS, n);
}

//尾插元素
void Insert(Link* head,const int s,const int n)
{
	Link* p = NULL;
	p = (Link*)malloc(LEN);
	if (p == NULL)
	{
		return;
	}
	while (head->next != NULL)
	{
		if (head->xuhao == s)
		{
			p->xuhao = s + 1;
			p->number = n;
			p->next = head->next;
			head->next = p;
			while (p->next != NULL)
			{
				p->xuhao += 1;
				p = p->next;
			}
			break;
		}
		head = head->next;
	}
}

//删除元素
void Delete(Link* head,const int n)
{
	Link* det = NULL, * tmp = head;
	int i = 0;
	while (i < n && tmp->next != NULL)
	{
		det = tmp;
		tmp = tmp->next;
		i++;
	}
	if (tmp != NULL)
	{
		det->next = tmp->next;
		free(tmp);
	}

}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[10] = { 0 };
	int i = 0;
	while (n)
	{
		arr[i] = n;
		i++;
		scanf("%d", &n);
	}
	Link* head = Creat(i, arr);
	Output(head);

	int S = 0;
	scanf("%d", &S);
	S = SreachS(head,S);
	printf("%d\n", S);

	int N = 0;
	scanf("%d", &N);
	SearchN(head, N);

	int N1 = 0, S1 = 0;
	scanf("%d %d", &S1, &N1);
	Insert(head, S1, N1);
	Output(head);

	int S2 = 0;
	scanf("%d", &S2);
	Delete(head, S2);
	Output(head);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值