链表的操作

       链表的操作包括利用链表的插入运算建立线性链表,然后利用链表的查找、删除、计数、输出等运算反复实现链表的这 些操作(插入、删除、查找、计数、输出单独写成函数的形式。今天对链表的实现进行了代码的总结。
代码如下:
#include<stdio.h>
#include <unistd.h>
#include<stdlib.h>

#define ERROR -1
//#include<windows.h>
typedef struct Node { //节点的构造
	int data;
	struct Node *PNext;
} NODE, *PNODE;
PNODE create_list(void)  //链表的创建
{
	int len;
	int i;
	int val;
	PNODE phead = (PNODE)malloc(sizeof(NODE));
	if (NULL == phead) {
		printf("创建链表失败!");
		exit(-1);
	}
	else {
		PNODE ptail = phead;
		phead->PNext = NULL;
		printf("请输入表的长度:");
		scanf("%d", &len);
		getchar();
		for (i = 0; i < len; i++) {
			PNODE p = (PNODE)malloc(sizeof(NODE));
			if (NULL == p) {
				printf("内存申请失败!");
				exit(-1);
			}
			else {
				printf("请输入链表的值:");
				scanf("%d", &val);
				getchar();
				p->data = val;
				ptail->PNext = p;
				p->PNext = NULL;
				ptail = p;
			}
			printf("\n");
		}
	}
	return phead;
}
//PNODE Insert_list(PNODE phead, int pos, int val)//插入
//{
//	int i = 0;
//	PNODE p = phead;
//	while (p && (i < pos - 1)) {
//		p = p->PNext;
//		i++;
//	}
//	if (!p || i > pos - 1) {
//		printf("输入位置有误!");
//		return 0;
//	}
//	PNODE q = (PNODE)malloc(sizeof(NODE));
//	q->data = val;
//	q->PNext = p->PNext;
//	p->PNext = q;
//	return phead;
//}
PNODE Insert_list(PNODE phead, int i, int e)
{
	PNODE pre, s;
	int k;
	if (i <= 0) {
		return NULL;
	}
	pre = phead;
	k = 0;
	while (pre != NULL && k < i - 1) {
		pre = pre->PNext;
		k = k + 1;
	}
	if (!pre) {
		printf("插入位置不合理!");
		return NULL;
	}
	s = (PNODE)malloc(sizeof(NODE));
	s->data = e;
	s->PNext = pre->PNext;
	pre->PNext = s;
	printf("插入成功!");
	return phead;
}
void delect_list(PNODE phead, int pos)
{
	int i = 0;
	PNODE p = phead, q;
	while ((NULL != p->PNext) && (i < pos - 1)) {
		p = p->PNext;
		i++;
	}
	if (!(p->PNext)) {
		printf("输入位置有误!");
		return;
	}
	q = p->PNext;
	p->PNext = q->PNext;
	free(q);
	q = NULL;//防止出现野指针
	printf("删除成功!");
}
int length_list(PNODE phead)//求 链表的长度
{
	int len = 0;
	PNODE p = phead->PNext;
	while (NULL != p) {
		len++;
		p = p->PNext;
	}
	return len;
}
void sord_list(PNODE phead)//链表排序
{
	int i, j;
	int temp;
	int len = length_list(phead);
	PNODE p = phead, q = phead;
	for (i = 1; i < len; i++) {
		q = p;
		p = p->PNext;
		for (j = i; j <= len; j++) {
			int temp;
			q = q->PNext;
			if (p->data > q->data) {
				temp = p->data;
				p->data = q->data;
				q->data = temp;
			}
		}
	}
//for (i = 0, p = phead->PNext; i < len - 1; i++, p = p->PNext)
//{
// for (j = i + 12, q = p->PNext; j < len; j++, q = q->PNext)
// {
//  if (p->data > q->data)//交换数据
//  {
//   temp = p->data;
//   p->data = q->data;
//   q->data = temp;
//  }
// }
//}
}
void list_traverse(PNODE phead)
{
	PNODE p;
	p = phead->PNext;
	printf("phead=");
	while (p) {
		printf("%d", p->data);
		p = p->PNext;
	}
	printf("\n");
}
void get_elem(PNODE phead, int pos)
{
	int j = 1;
	PNODE p = phead->PNext;
	while ((j != pos) && (p != NULL)) {
		j++;
		p = p->PNext;
	}
	if (j == pos) {
		printf("%d\n", p->data);
	}
	else {
		printf("未找到!");
	}
}
void menu()
{
	/*利用链表的插入运算建立线性链表,然后利用链表
	 的查找、删除、计数、输出等运算反复实现链表的这
	 些操作(插入、删除、查找、计数、输出单独写成函数的形式),
	 并能在屏幕上输出操作前后的结果。画出搜索顺序示意图。*/
	printf("************************************************\n");
	printf("************************************************\n");
	printf("***********      1.   链表的插入         *******\n");
	printf("***********      2.   链表的删除         *******\n");
	printf("***********      3.   链表的查找         *******\n");
	printf("***********      4.   链表的计数         *******\n");
	printf("***********      5.   链表的排序         *******\n");
	printf("************************************************\n");
	printf("************************************************\n");
}
int main()
{
	int put, pos, val;
	PNODE phead;
	phead = create_list();
	list_traverse(phead);
	while (1) {
		menu();
		printf("请选择您需要的功能:>");
		scanf("%d", &put);
		getchar();
		switch (put) {
		case 1:
			printf("请输入插入的位置:>");
			scanf("%d", &pos);
			getchar();
			printf("请输入插入的值:>");
			scanf("%d", &val);
			getchar();
			phead = Insert_list(phead, pos, val);
			list_traverse(phead);
			break;
		case 2:
			printf("输入删除元素的位置:>");
			scanf("%d", &pos);
			getchar();
			delect_list(phead, pos);
			list_traverse(phead);
			break;
		case 3:
			printf("输入查找位置:>");
			scanf("%d", &pos);
			get_elem(phead, pos);
			break;
		case 4:
			printf("表长为:%d\n", length_list(phead));
			break;
		case 5:
			sord_list(phead);
			list_traverse(phead);
			break;
		default:
			printf("选择功能有误,请重新选择:\n");
		}
	}
	getchar();
	return 0;
}

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Python中的链表操作包括创建链表、合并链表删除链表中的元素以及翻转链表中的一段位置的元素。首先,我们可以通过创建一个链表节点类和链表操作类来实现这些操作链表节点类定义了节点的值和指向下一个节点的指针。链表操作类包含了创建链表、浏览链表等方法。 创建链表操作通过传入一个列表来创建链表。每个列表元素都会被转换为一个节点,并通过指针连接起来。浏览链表操作可以将链表中的元素遍历并返回一个列表。 除此之外,还可以进行一些其他的链表操作,如统计链表中某个元素出现的次数。可以通过调用列表的count()方法来实现。 还可以删除链表中倒数第n个元素并返回头结点。这个操作可以通过一次扫描实现。首先,将链表中的每个元素指向一个列表中的每个元素。然后,根据n的值来删除链表中的对应节点。 总之,Python提供了丰富的链表操作方法,可以根据需求进行选择和使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [链表操作基础(python)](https://blog.csdn.net/beautiful77moon/article/details/120443389)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [python链表所有操作详解](https://blog.csdn.net/starmoth/article/details/88323536)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值