首页 > 其他分享 >线性表-链表的操作实现

线性表-链表的操作实现

时间:2023-08-10 17:55:42浏览次数:31  
标签:LinkList 线性表 int void list 链表 操作 LinkNode cur

LinkList.h

#ifndef __LINKLIST__H__
#define __LINKLIST__H__

#include <stdio.h>
#include <stdlib.h>

typedef struct LinkNode
{
	int data;
	struct LinkNode* next;

}LinkNode;

typedef struct LinkList
{
	LinkNode* head;
}LinkList;

// // 遍历链表
void LinkListPrint(LinkList* list);

// 初始化链表
LinkList* LinkListInit(void);

// 创建结点
LinkNode* CreateNode(int data);

// 头插结点
void LinkListPushFront(LinkList* list, int data);

// 尾插结点
void LinkListPushBack(LinkList* list, int data);

// 任意位置插结点
void LinkListPushPos(LinkList* list, int pos, int data);

// 头删结点
void LinkListPopFront(LinkList* list);

// 尾删结点
void LinkListPopBack(LinkList* list);

// 任意位置删结点
void LinkListPopPos(LinkList* list, int pos);

// 按照值删除
void LinkListPopVal(LinkList* list, int val);

// 按照值修改
void LinkListModifyVal(LinkList* list, int oldVal, int newVal);

// 按照位置修改
void LinkListModifyPos(LinkList* list, int pos, int newVal);

// 按照位置查找
void LinkListSeekPos(LinkList* list, int pos);

// 按值查找
void LinkListSeekVal(LinkList* list, int val);

// 清空链表
void LinkListClear(LinkList* list);

//链表销毁
void LinkListDesdroy(LinkList** list);

#endif

LinkList.c

#include "LinkList.h"

// 遍历链表
void LinkListPrint(LinkList* list)
{
	LinkNode* cur = list->head;
	while(cur != NULL)
	{
		printf("%d->", cur->data);	
		cur = cur->next;
	}
	putchar('\n');
}

// 初始化链表
LinkList* LinkListInit()
{
	LinkList* list = (LinkList*)malloc(sizeof(LinkList));
	if(NULL == list)
	{
		printf("malloc fail!\n");
		exit(-1);
	}
	list->head = NULL;
	return list;
}

// 创建结点
LinkNode* CreateNode(int data)
{
	LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
	newNode->data = data;
	newNode->next = NULL;
	return newNode;
}

// 头插结点
void LinkListPushFront(LinkList* list, int data)
{
	LinkNode* newNode = CreateNode(data);
	newNode->next = list->head;
	list->head = newNode;
}


// 尾插结点
void LinkListPushBack(LinkList* list, int data)
{
	LinkNode* newNode = CreateNode(data);

	LinkNode* cur = list->head;
	// LinkNode* temp = NULL;
	while(cur->next != NULL)
	{
		// temp = cur;
		cur = cur->next;
	}
	cur->next = newNode;

}

// 任意位置插结点
void LinkListPushPos(LinkList* list, int pos, int data)
{
	if(pos < 0 || list->head == NULL)
	{
		printf("无效位置插入!\n");
		return;
	}

	if(0 == pos)
	{
		LinkListPushFront(list, data);
		return;
	}

	LinkNode* newNode = CreateNode(data);
	LinkNode* cur = list->head;
	while(--pos)
	{
		cur = cur->next;
	}

	newNode->next = cur->next;
	cur->next = newNode;

}

// 头删结点
void LinkListPopFront(LinkList* list)
{
	if(list->head == NULL)
	{
		printf("空链表!\n");
		return;
	}

	LinkNode* cur = list->head;
	list->head = list->head->next;
	free(cur);
	
}

// 尾删结点
void LinkListPopBack(LinkList* list)
{
	if(list->head == NULL)
	{
		printf("空链表!\n");
		return;
	}
	LinkNode* cur = list->head;
	LinkNode* temp = NULL;
	while(cur->next != NULL)
	{
		temp = cur;
		cur = cur->next;
	}
	temp->next = NULL;
	free(cur);
}

// 任意位置删结点
void LinkListPopPos(LinkList* list, int pos)
{
	if(pos < 0 || list->head == NULL)
	{
		printf("无效位置删除结点!\n");
		return;
	}

	if(0 == pos)
	{
		LinkListPopFront(list);
		return;
	}

	LinkNode* cur = list->head;
	LinkNode* temp = NULL;
	while(--pos)
	{
		cur = cur->next;
	}
	temp = cur->next;
	cur->next = cur->next->next;
	free(temp);
}

// 按照值删除
void LinkListPopVal(LinkList* list, int val)
{
	if(NULL == list->head)
	{
		printf("空链表!\n");
		return;
	}
	if(list->head->data == val)
	{
		LinkListPopFront(list);
		return;
	}

	LinkNode* cur = list->head;
	LinkNode* temp = NULL;
	while(cur->data != val)
	{
		temp = cur;
		cur = cur->next;
	}
	temp->next = cur->next;
	free(cur);

}

//按照值修改
void LinkListModifyVal(LinkList* list, int oldVal, int newVal)
{
	if(NULL == list->head)
	{
		printf("空链表!\n");
		return;
	}

	LinkNode* cur = list->head;
	while(cur)
	{
		if(cur->data == oldVal)
		{
			cur->data = newVal;
			return;
		}
		cur = cur->next;
	}
	printf("链表中没有值为%d的结点\n", oldVal);

}

// 按照位置修改
void LinkListModifyPos(LinkList* list, int pos, int newVal)
{
	if(pos < 0 || list->head == NULL)
	{
		printf("无效位置修改!\n");
		return;
	}
	LinkNode* cur = list->head;
	while(pos--)
	{
		cur = cur->next;
	}
	cur->data = newVal;


}

//按照位置查找
void LinkListSeekPos(LinkList* list, int pos)
{
	int temp = pos;
	if(pos < 0 || list->head == NULL)
	{
		printf("无效位置查找!\n");
		return;
	}
	LinkNode* cur = list->head;
	while(temp--)
	{
		cur = cur->next;
	}
	printf("%d位置的值是%d\n", pos, cur->data);

}

//按值查找
void LinkListSeekVal(LinkList* list, int val)
{
	LinkNode* cur = list->head;
	int pos = 0;
	while(cur)
	{
		if(cur->data == val)
		{
			printf("找到了值为%d的位置%d\n", cur->data, pos);
			return;
		}
		cur = cur->next;
		++pos;
	}
	printf("没有值为%d的结点\n", val);

}

// 清空链表
void LinkListClear(LinkList* list)
{
	if(NULL == list)
		return;
	LinkNode* cur = list->head;
	LinkNode* temp = NULL;
	while(cur)
	{
		temp = cur;
		cur = cur->next;
		free(temp);
	}

	list->head = NULL;
	printf("清空链表完成!\n");

}

//链表销毁
void LinkListDesdroy(LinkList** list)
{
	LinkListClear(*list);
	free(*list);
	*list = NULL;

	printf("链表销毁完成!\n");
}

main.c

#include "LinkList.h"

void LinkListTest(void)
{
	// 初始化链表
	LinkList* list = LinkListInit();

	// 头插结点
	printf("头插结点\n");
	LinkListPushFront(list, 100);
	LinkListPushFront(list, 200);
	LinkListPushFront(list, 300);
	LinkListPrint(list);

	// 尾插结点
	printf("尾插结点\n");
	LinkListPushBack(list, 400);
	LinkListPushBack(list, 500);
	LinkListPushBack(list, 600);
	LinkListPrint(list);

	// 任意位置插结点
	printf("任意位置插结点\n");
	LinkListPushPos(list, 0, 700);
	LinkListPrint(list);
	LinkListPushPos(list, 3, 800);
	LinkListPrint(list);
	LinkListPushPos(list, 8, 900);
	LinkListPrint(list);

	// 头删结点
	printf("头删结点\n");
	LinkListPopFront(list);
	LinkListPrint(list);
	
	// 尾删结点
	printf("尾删结点\n");
	LinkListPopBack(list);
	LinkListPrint(list);

	// 任意位置删结点
	printf("任意位置删结点\n");
	LinkListPopPos(list, 2);
	LinkListPrint(list);

	// 按照值删除
	printf("按照值删除\n");
	LinkListPopVal(list, 200);
	LinkListPrint(list);

	//按照值修改
	printf("按照值修改\n");
	LinkListModifyVal(list, 300, 800);
	LinkListPrint(list);

	// 按照位置修改
	printf("按照位置修改\n");
	LinkListModifyPos(list, 2, 222);
	LinkListPrint(list);

	// 按照位置查找
	printf("按照位置查找\n");
	LinkListSeekPos(list, 0);

	// 按值查找
	printf("按值查找\n");
	LinkListSeekVal(list, 222);

	// 清空链表
	LinkListClear(list);

	//链表销毁
	LinkListDesdroy(&list);

}



int main(void)
{

	LinkListTest();

	return 0;
}

标签:LinkList,线性表,int,void,list,链表,操作,LinkNode,cur
From: https://www.cnblogs.com/bcc0729/p/17621095.html

相关文章

  • - Django操作cookie - Django操作session - CBV添加装饰器 - 中间件 - csrf跨站请求
    Django操作cookie设置cookie:对象点set_cookie()获取cookie:request点COOKIE点getset_cookie('key','value',max_age=5,expires=5)参数:KEY:k值value:V值max_age=None,超时时间cookie需要延续的时间(以秒为单位)如果参数是\None``,这个cookie会延续到浏览器关闭为止expires=No......
  • ATL使用.rgs注册脚本文件操作注册表注册Com组件
    1.      ATL注册组件1.1     创建注册脚本注册脚本通过操作系统注册表完成Com服务的注册,通过数字形式而非代码API的形式完成,这种形式显得更加简单有效,因为它只需要几行数字代码就可以将一个Key添加到注册表中。使用ATL向导时,会自动的生成一个后缀为.rgs的注册脚本......
  • 使用Visual Studio打开Unity脚本,VS提示“未能完成操作,参数错误“
    使用VisualStudio打开Unity脚本,VS提示"未能完成操作,参数错误".是蛮突然的,但我猜测跟公司这两天动不动突然停电,非法关机导致的.上网搜了各种办法,列举下来:1.https://blog.csdn.net/thksdhr/article/details/126287647链接里这位大哥提供的解决方法要删除这些文件,重新生成,不......
  • Django操作cookie,Django操作session,Django中的Session配置,CBV添加装饰器,中间件,cs
    Django操作cookiecookie参数:●key,键●value=’’,值●max_age=None,超时时间cookie需要延续的时间(以秒为单位)如果参数是\None``,这个cookie会延续到浏览器关闭为止expires=None,超时时间(IErequiresexpires,sosetitifhasn’tbeenalready.)path=’/‘,Co......
  • 如何在 Cent OS 7 操作系统安装 Clang
    一、介绍Clang是一种基于LLVM的C、C++、Objective-C和Objective-C++编译器,它提供了一个高效的编译流程,并且能够生成高质量的代码。在本文中,我们将介绍如何在CentOS7上安装Clang。二、安装步骤更新系统在安装Clang之前,我们需要确保系统处于最新状态。可以使用以......
  • 银河麒麟高级操作系统V10助力联通云建设打出组合拳
    联通云基于“双引擎基座+一云多芯”为不同行业场景提供可靠、高质量的应用上云服务。在核心代码进行了全面把控,定制多架构芯片应用适配模版,开发了计算、存储、网络、中间件等组件,全面适配自主化服务器和操作系统,提供云服务器、云硬盘、裸金属、负载均衡、虚拟私有云等多个IaaS和......
  • Java不能操作内存?Unsafe了解一下
    前言C++可以动态的分类内存(但是得主动释放内存,避免内存泄漏),而java并不能这样,java的内存分配和垃圾回收统一由JVM管理,是不是java就不能操作内存呢?当然有其他办法可以操作内存,接下来有请Unsafe出场,我们一起看看Unsafe是如何花式操作内存的。Unsafe介绍Unsafe见名知意,不安全的意思......
  • 【看表情包学Linux】系统下的文件操作 | 文件系统接口 | 系统调用与封装 | open,write
      ......
  • Microsoft SqlServer数据库备份出现操作系统错误 5(拒绝访问。)
    备份对于服务器“ECS-133509\SQLEXPRESS”失败。 (Microsoft.SqlServer.SmoExtended)System.Data.SqlClient.SqlError:无法打开备份设备'C:\555548885455.bak'。出现操作系统错误5(拒绝访问。)。(Microsoft.SqlServer.Smo)解决办法:1、不能将备份文件放在根目录下,......
  • 160. 相交链表
    给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。示例1:输入:intersectVal=8,listA=[4,1,8,4,5],listB=[5,6,1,8,......