数据结构基础篇-------2. 单链表的创建及运算

本文详细介绍了单链表的基本操作,包括创建空链表、头插法、尾插法、按位置插入、按顺序插入、头删法、数据修改、数据查找、链表翻转等,并提供了完整的C语言实现代码。

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

/*
 * 单链表的创建及其运算
 * 2018.10.23
 * @L.F
 *
 * */

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int DataType_t;//结点的数据类型为DataType_t,这里是Int型

typedef struct Node    //结点类型的定义
{
	DataType_t Data;   //结点的数据域类型
	struct Node *Next; //结点的指针域类型
}LinkList;

LinkList *LinkListCreate() //创建一个空的链表
{
	LinkList *h = (LinkList *)malloc(sizeof(LinkList)); //创建一个头结点
	h->Next = NULL; //初始化结构体
	return h;
}

void LinkListInsertHead(LinkList *h, DataType_t Value)//头插法插入数据
{
	LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));//申请空间并赋值
	Temp->Data = Value;
	Temp->Next = h->Next;//将头结点的下一个结点的地址保存在新插入结点的指针域里面
	h->Next = Temp;//将新插入的结点的地址保存在头结点的指针域里面
	return ;
}

void LinkListInsertTail(LinkList *h, DataType_t Value)//尾插法插入数据
{
	LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));//申请空间并赋值
	Temp->Data = Value;
	while(h->Next != NULL)//找到最后一个结点
	{
		h = h->Next;
	}
	Temp->Next = NULL;
	h->Next = Temp;
	return ;
}

void LinkListInsertPos(LinkList *h, int pos, DataType_t Value)//按照位置插入数据
{
	LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));
	Temp->Data = Value;
	int i =1;
	while(h->Next != NULL && i<= pos)
	{
		h = h->Next;
		i++;
	}
	if(h->Next == NULL)
	{
		printf("位置出错\n");
	}
	else
	{
		Temp->Next = h->Next;
		h->Next = Temp;
	}
	return ;
}

void LinkListInsertSort(LinkList *h, DataType_t Value)//按照顺序插入(自带排序功能)
{
	LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));
	Temp->Data = Value;
	while(h->Next != NULL && h->Next->Data < Temp->Data)
	{
		h = h->Next;
	}
	Temp->Next = h->Next;
	h->Next = Temp;
	return ;
}

DataType_t LinkListDeleteHead(LinkList *h)//头删法删除数据
{
	/*h->Next = h->Next->Next;//只删除*/
	/*
	 * DataType_t Value;
	 * Value = h->Next->Data;
	 * h->Next = h->Next->Next;
	 * */
	/*释放删除结点*/
	DataType_t Value;
	LinkList *Temp = h->Next;
	Value = h->Next->Data;
	h->Next = h->Next->Next;
	free(Temp);
	Temp = NULL;
	return Value;
}

int LinkListUpdata(LinkList *h, DataType_t OldValue, DataType_t NewValue)//按照数据修改数据
{
	while(h->Next != NULL)
	{
		if(h->Next->Data == OldValue)
		{
			h->Next->Data = NewValue;
			return 0;
		}
		h = h->Next;
	}
	printf("%d 是不存在的", NewValue);
	return -1;
}

int LinkListSearch(LinkList *h,DataType_t Value)//按照数据查找位置
{
	int pos = 0;
	while(h->Next != NULL)
	{
		if(h->Next->Data == Value)
		{
			return pos;
		}
		h = h->Next;
		pos++;
	}
	printf("%d 不存在\n", Value);
	return -1;
}

void LinkListReverse(LinkList *h)//实现链表的翻转
{
	LinkList *p = h->Next;
	LinkList *q;
	h->Next = NULL;
	while(p != NULL)
	{
		q = p;
		p = p->Next;
		q->Next = h->Next;
		h->Next = q;
	}
	return ;
}

void LinkListShow(LinkList *h)//打印数据
{
	while(h->Next != NULL)
	{
		h = h->Next;
		printf("             %d", h->Data);
	}
	putchar(10);
}
int main(int argc, const char *argv[])
{
	LinkList *h = LinkListCreate();
	int F,s,i,a,n;
	while(1)
	{
	printf("请输入您的需求:      1.头插法插入数据        2.尾插法插入数据        3.按照位置插入数据\n");
	printf("                      4.按照顺序插入数据      5.头删法删除数据        6.按照数据修改数据\n");
	printf("                      7.按照数据查找位置      8.实现链表的翻转\n");
	scanf("%d", &F);
		switch(F)
		{
		case 1:
			printf("请输入您要插入的数据个数:");
			scanf("%d",&s);
			for(i=0; i<s;i++)
			{
				printf("请输入您要插入的数据:");
				scanf("%d", &a);
				LinkListInsertHead(h,a);
			}
			LinkListShow(h);
			break;
		case 2:
			printf("请输入您要插入的数据个数:");
			scanf("%d",&s);
			for(i=0; i<s;i++)
			{
				printf("请输入您要插入的数据:");
				scanf("%d", &a);
				LinkListInsertTail(h,a);
			}
			LinkListShow(h);
			break;
		case 3:
			printf("请输入您要插入数据的位置: ");
			scanf("%d", &n);
			printf("请输入您要插入的数据: ");
			scanf("%d", &a);
    	    LinkListInsertPos(h, n, a);
			LinkListShow(h);
			break;
		case 4:
			printf("请输入要插入的数据个数: ");
			scanf("%d",&s);
			for(i=0; i<s;i++)
			{
				printf("请输入要插入的数据:");
				scanf("%d", &a);
				LinkListInsertSort(h, a);
			}
			LinkListShow(h);
			break;
		case 5:
            LinkListDeleteHead(h);
			LinkListShow(h);
			break;
		case 6:
			printf("请输入需要修改的数据:");
			scanf("%d", &a);
			printf("请输入修改为的数据: ");
			scanf("%d", &n);
		    LinkListUpdata(h, a, n);
			LinkListShow(h);
			break;
		case 7:
			printf("请输入您要查找位置的数据: ");
			scanf("%d",&a);
			printf("所查数据的位置为%d \n", LinkListSearch(h,a));
			break;
		case 8:
			LinkListShow(h);
			LinkListReverse(h);
			LinkListShow(h);
			break;
		default:
			break;
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值