线性表-链表的操作实现

bcc0729 / 2023-08-10 / 原文

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;
}