C语言 单链表 基本操作与实现

C语言单链表的基本操作

结构体

typedef struct {
	int data;
	struct SqNode * Next;//指向下一个节点
}SqNode,*SqList;

链表的初始化

SqList InitList(SqNode* L)
{
	L = (SqNode*)malloc(sizeof(SqNode));//动态申请空间
	if(!L)
	return NULL;//如果链表初始化失败则返回空值
	L->Next = NULL;
	return L;
}

创建链表(头插法)

SqList HeadCreateList(SqNode *L)
{
	printf("请输入您需要创建的顺序表,输入999结束\n");
	int Value = 0;
	scanf_s("%d", &Value);
	getchar();
	while (Value != 999)
	{
		SqNode * s ;
		s = (SqNode*)malloc(sizeof(SqNode));
		s->data = Value;
		s->Next =L->Next;//使创建的节点先指向头结点的下一个节点
		L->Next = s;//使头节点指向创建的节点,实现头插法
		scanf_s("%d", &Value);
		getchar();
	}
	return L;
}

创建链表尾插法

SqList TailCreateList(SqNode* L)
{
	/*
	第一个参数:参数链表的头指针
	函数功能:设以一个指针始终指向链表的尾部,实现尾插法保证顺序表顺序不变
	*/
	SqNode* s;
	SqNode* T;//指向链表的尾部
	T = L;
	int Value;
	printf("请输入你要创建的顺序表,输入999结束创建\n");
	scanf_s("%d", &Value);
	getchar();
	while (Value!=999)
	{
		s = (SqNode*)malloc(sizeof(SqNode));
		s->data = Value;
		T->Next = s;//使链表的最后一个节点指向创建的s节点
		T = s;//使链表指向最后一个节点,实现尾插法
		scanf_s("%d", &Value);
		getchar();
	}
	T->Next = NULL;//使最后一个节点指向NULL
	return L;
}
//创建链表(尾插法)

遍历链表

SqList PrintfList(SqNode *L)
{
	SqNode* s = L->Next;
	while (s!=NULL)
	{
		printf("%d\n", s->data);
		s = s->Next;
	}
}

获取链表长度

int  LengthList(SqNode* L)
{
	int i = 0;
	SqList s;
	s = L->Next;
	while (s != NULL)
	{
		i++;
		s = s->Next;
	}
	return i;
}

按位查找元素

SqList  LocateElement(SqNode* L, int Locate)
{
/*
第一个参数:链表头节点地址
第二个参数:传入位置
函数功能:根据节点位置寻找该位置节点的信息
*/
	SqNode* s;
	s = L->Next;
	int i = 0;
	while (i < Locate-1 && s != NULL)
	{
		i++;
		s = s->Next;
	}
	return s;
}

按值查找

SqList SecletElement(SqNode* L, int Value)
{
	/*
	第一个参数:代表顺序表
	第二个参数:代表需要查询的值
	主要功能:根据传入的参数值查询出该值所在的节点的信息
	*/
	SqNode* s=NULL;
	s = L->Next;
	while (s!=NULL && s->data!=Value)
	{
		s = s->Next;
	}
	return s;
}

插入元素

SqList InsertElement(SqNode* L, int Locate)
{
	/*
	第一个参数:顺序表
	第二个参数:插入的位置
	函数功能:在链表指定的位置插入一个节点
	*/
	if (Locate > LengthList(L)+1)
	{
		printf("插入失败\n");
	}
	SqNode* s;
	SqNode* r;
	int Value = 0;
	r = (SqNode*)malloc(sizeof(SqNode));
	int i=0;
	s = L->Next;
	while (s!=NULL && i<Locate-2)
	{
		s = s->Next;
		i++;
	}
	printf("请输入你要插入的数据:");
	scanf_s("%d", &Value);
	getchar();
	r->data = Value;
	r->Next = s->Next;
	s->Next = r;
	return L;
}

根据位置删除节点

SqNode DeleteElemnent(SqNode* L, int Locate)
{
	/*
	第一个参数:代表链表的头地址
	第二个参数:代表传入需要删除节点的位置
	函数功能:根据指定的位置删除节点
	*/
	int i = 0;
	SqNode* q;
	SqNode* s;
	SqNode r;
	s = L->Next;
	while (i<Locate-2&&s!=NULL)
	{
		s = s->Next;
		i++;
	}
	q = s->Next;
	s->Next = s->Next;
	r = *q;
	free(q);
	return r;

}

完整代码

文件夹结构

在这里插入图片描述

线性表–单链表.c文件

#include<stdio.h>
#include<stddef.h>
#include<stdlib.h>
#include"线性表--单链表.h"

SqList InitList(SqNode* L)
{
	L = (SqNode*)malloc(sizeof(SqNode));
	//memset(L->data, NULL, sizeof(int));
	L->Next = NULL;
	return L;
}
//初始化链表
SqList HeadCreateList(SqNode *L)
{
	printf("请输入您需要创建的顺序表,输入999结束\n");
	int Value = 0;
	scanf_s("%d", &Value);
	getchar();
	while (Value != 999)
	{
		SqNode * s ;
		s = (SqNode*)malloc(sizeof(SqNode));
		s->data = Value;
		s->Next =L->Next;
		L->Next = s;
		scanf_s("%d", &Value);
		getchar();
	}
	return L;
}
//创建链表(头插法)
SqList TailCreateList(SqNode* L)
{
	/*
	第一个参数:参数链表的头指针
	函数功能:设以一个指针始终指向链表的尾部,实现尾插法保证顺序表顺序不变
	*/
	SqNode* s;
	SqNode* T;//指向链表的尾部
	T = L;
	int Value;
	printf("请输入你要创建的顺序表,输入999结束创建\n");
	scanf_s("%d", &Value);
	getchar();
	while (Value!=999)
	{
		s = (SqNode*)malloc(sizeof(SqNode));
		s->data = Value;
		T->Next = s;
		T = s;
		scanf_s("%d", &Value);
		getchar();
	}
	T->Next = NULL;
	return L;
}
//创建链表(尾插法)
SqList PrintfList(SqNode *L)
{
	SqNode* s = L->Next;
	while (s!=NULL)
	{
		printf("%d\n", s->data);
		s = s->Next;
	}
}
//打印顺序表
int  LengthList(SqNode* L)
{
	int i = 0;
	SqList s;
	s = L->Next;
	while (s != NULL)
	{
		i++;
		s = s->Next;
	}
	return i;
}
//获取链表长度
SqList  LocateElement(SqNode* L, int Locate)
{
	SqNode* s;
	s = L->Next;
	int i = 0;
	while (i < Locate-1 && s != NULL)
	{
		i++;
		s = s->Next;
	}
	return s;
}
//按位查找元素
SqList SecletElement(SqNode* L, int Value)
{
	/*
	第一个参数:代表顺序表
	第二个参数:代表需要查询的值
	主要功能:根据传入的参数值查询出该值所在的节点的信息
	*/
	SqNode* s=NULL;
	s = L->Next;
	while (s!=NULL && s->data!=Value)
	{
		s = s->Next;
	}
	return s;
}
//按值查找
SqList InsertElement(SqNode* L, int Locate)
{
	/*
	第一个参数:顺序表
	第二个参数:插入的位置
	函数功能:在链表指定的位置插入一个节点
	*/
	if (Locate > LengthList(L)+1)
	{
		printf("插入失败\n");
	}
	SqNode* s;
	SqNode* r;
	int Value = 0;
	r = (SqNode*)malloc(sizeof(SqNode));
	int i=0;
	s = L->Next;
	while (s!=NULL && i<Locate-2)
	{
		s = s->Next;
		i++;
	}
	printf("请输入你要插入的数据:");
	scanf_s("%d", &Value);
	getchar();
	r->data = Value;
	r->Next = s->Next;
	s->Next = r;
	return L;
}
//插入元素
SqNode DeleteElemnent(SqNode* L, int Locate)
{
	/*
	第一个参数:代表链表的头地址
	第二个参数:代表传入需要删除节点的位置
	函数功能:根据指定的位置删除节点
	*/
	int i = 0;
	SqNode* q;
	SqNode* s;
	SqNode r;
	s = L->Next;
	while (i<Locate-2&&s!=NULL)
	{
		s = s->Next;
		i++;
	}
	q = s->Next;
	s->Next = s->Next;
	r = *q;
	free(q);
	return r;

}
//根据位置删除节点

线性表–单链表.h文件

#pragma once
#ifndef __线性表-链表__H__
#define __线性表
typedef struct {
	int data;
	struct SqNode * Next;

}SqNode,*SqList;

SqList InitList(SqNode* L);//初始化链表
SqList HeadCreateList(SqNode* L);//创建链表(头插法)
SqList TailCreateList(SqNode* L);//创建链表(尾插法)
SqList PrintfList(SqNode* L);//打印顺序表
int  LengthList(SqNode* L);//获取链表长度
SqList LocateElement(SqNode* L, int Locate);//按位查找元素
SqList SecletElement(SqNode * L, int Value);//按值查找
SqList InsertElement(SqNode* L, int Locate);//插入元素
SqNode DeleteElemnent(SqNode* L, int Locate);//根据位置删除节点
#endif // !__线性表-链表__H__

Main函数文件

#include<stdio.h>
#include"线性表--单链表.h"

int main()
{
	SqNode *L=NULL;

	{
		L = InitList(L);
		L=TailCreateList(L);
		PrintfList(L);
		//L = HeadCreateList(L);
	}
	//链表初始化于创建
	
	{
		int Length = LengthList(L);
	    printf("链表长度为:%d\n", Length);
	}
	//获取链表长度

	{
		PrintfList(L);
	}
	//打印链表
	
	{
		SqNode *s;
		int locate = 0;
		printf("你要查找第几个元素?\n");
		scanf_s("%d", &locate);
		s=LocateElement(L, locate);
		printf("您查找的元素是:%d\n", s->data);
		
	}
	//按位查找
	
	
	{
		SqNode *s ;
		int Value;
		printf("请输入您要查找的元素:");
		scanf_s("%d",&Value);
		s=SecletElement(L,Value);
		if (s== NULL)
		{
			printf("查找失败\n");
		}
		else {
			printf("%d\n", s->data);
		}
	}
	//按值查找

	{
		int Locate = 0;
		printf("请输入您要插入的位置:");
		scanf_s("%d", &Locate);
		getchar();
		L=InsertElement(L, Locate);
		PrintfList(L);
	}
	//插入元素

	{
		printf("请输入你要删除元素的位置:");
		int Locate;
		SqNode r;
		scanf_s("%d", &Locate);
		getchar();
		r=DeleteElemnent(L, Locate);
		printf("您删除的元素是:%d", r.data);
	}
	//删除元素
}

欢迎大家在评论区赐教,谢谢

  • 18
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~搬~运~工~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值