链表从(C语言代码实现)0——>1(超详解)

前言:摸索了好久才搞定链表,希望对大家有所帮助

 1、链表的初始化

2、按位插入

3、按值删除

4、按位查找

5、打印链表

一、编写头文件:这里头文件是:1.h

​
​//这里的自定义的头文件为:1.h
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkList
{
	int date;
	struct LinkList* next;
}LinkNode,*LinkList;
//初始化链表
void IniteList(LinkList* head);
//按位置插入
void InsertLink(LinkList* header,int i);
//打印
void print(LinkList head);
//按值删除
void DelateLink(LinkList* header,int vulue);
//按位查找
void GetElem(LinkList header, int i);
//格式空行
void emply();

​

​

二、书写函数模块:我定义的第一个源文件为1.c用于书写函数实现

​
#include"1.h"
//格式空行
void emply()
{
	printf("\n\n\n");
}

//创建新节点
LinkNode* NewNode(int n)
{
	LinkNode* NewNode = (LinkNode*)malloc(sizeof(LinkNode));
	if (NewNode == NULL)
	{
		printf("内存空间分配失败:\n");
		exit(1);
	}
	NewNode->date = n;
	NewNode->next = NULL;
	return NewNode;
}
void IniteList(LinkList* header)
{
	if (*header == NULL)
	{
		return;
	}
	//尾插
	LinkNode* tail;
	tail = *header;//开始时尾节点就是头节点
	printf("输入999退出输入\n");
	printf("请输入:\n");
	int n;
	scanf("%d", &n);
	getchar();//吃掉回车
	while (n != 999)
	{
		LinkNode* newnode =NewNode(n);//创立新节点
		tail->next=newnode;
		tail = newnode;//更新为节点位置
		printf("请输入数据:\n");
		scanf("%d",& n);
		getchar();//吃点回车
		

	}
	printf("链表创建成功\n");
}
//按位插入i为第几位
void InsertLink(LinkList* header,int i)
{
	printf("正在插入一个节点\n");
	if (*header ==NULL || i < 1)
		return;
	//找到第i-1的位置的节点
	LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));
	if (p == NULL)
	{
		printf("内存分配失败:\n");
		return;
	}
	p = *header;
	int j = 0;//开始时p所指向的位置头节点位置为0
	while (p != NULL && j < i - 1)
	{
		p = p->next;
		j++;
	}//循环结束时p的位置就是第i-1个节点
	if (p == NULL)
	{
		printf("插入的值不合法:\n");//即插入的值可能为为链表最后一个节点的后几位
		return;
	}
	//建立要插入的值
	int vulue;
	printf("请输入要插入的值:\n");
	scanf("%d", &vulue);
	getchar();//吃点回车
	LinkNode* newnode = NewNode(vulue);
	newnode->next = p->next;
	p->next = newnode;
	printf("插入成功\n");

}
//打印
void print(LinkList header)
{
	LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));//创建一个用来遍历的指针
	if (p == NULL)
	{
		printf("分配失败\n");
	}
	p = header->next;
	int e;
	while (p!= NULL)
	{
		e = p->date;
		p = p->next;
		printf("%d\t",e );
	}
	printf("\n");
}
//按值删除第一个值
void DelateLink(LinkList* header, int vulue)
{
	

	LinkNode*q = (LinkNode*)malloc(sizeof(LinkNode));//q为vulue所对应的节点,p为q的前一个结点
	LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));//q为vulue所对应的节点,p为q的前一个结点
	if (q == NULL)
	{
		printf("内存分配失败");
		return;
	}
	if (p == NULL)
	{
		printf("内存分配失败");
		return;
	}
	p = *header;//p指针指向的节点是q指针指向节点的前一个结点;
	q = (*header)->next;
	int i=1;//q的起始位置
	while (q != NULL)//q最终指向所要删除的节点则不可能为空指针NULL
	{
		
		if (q->date == vulue)//找到所要删除的节点结束循环
			break;
		else
		{
			p = q;
			q = q->next;
			i++;
		}
	}
	if (q == NULL)//两种情况:1、该链表为空链表。2、当q遍历完链表也没找到对应的值此时q也指向空指针NULL
	{
		printf("链表里无此元素:\n");
		return;
	}
	p->next = q->next;
	free(q);//释放所删除的空间
	printf("删除的节点是第%d个\n", i);
	printf("删除成功\n");
}
//按位查找
void GetElem(LinkList header, int i)
{
	LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));
	if (p == NULL)
	{
		printf("内存分配失败:\n");
		return;;
	}
	if (header == NULL)//头节点为空不合法
		return;
	p = header->next;//
	int j = 1;//p的对应位置
	while (p != NULL&&j<i )//循环的目的是找到所寻i的位置所对应的节点p
	{
		p = p->next;
		j++;
	}
	if (p == NULL)//两种情况:1、为空链表。2、i>链表里的节点个数;
	{
		printf("该链表没有这个位置的节点\n");
		return;
	}
	else
	{
		printf("查找成功对应的值为:%d", p->date);
	}

}

​

三、第二个源文件用于主函数的书写(main函数)

#include"1.h"//声明头文件
int main()
{
	//创建链表头
	LinkList header = (LinkNode*)malloc(sizeof(LinkNode));
	if (header== NULL)
	{
		printf("内存空间分配失败:\n");
		return 0;
	}
	header->next = NULL;
	IniteList(&header);//初始化链表
	print(header);
	emply();//用于空行
	//在指定位置插入值
	int j;
	printf("请输入你想插入的位置:\n");
	scanf("%d", &j);
	InsertLink(&header,j);//在第三个位置插入节点
	printf("点插入后链表为:\n");
	print(header);
	emply();//用于空行
	//删除
	printf("请输入你要删除的值:\n");
	int a;
	scanf("%d", &a);
	printf("删除后:\n");
	DelateLink(&header, a);
	print(header);
	emply();//用于空行
	//按位查找
	int i;
	printf("请输入你想查找的位置:\n");
	scanf("%d", &i);
	GetElem(header, i);
	return 0;
}

四、最终的运行结果为:

 最后欢迎大家留言自己所遇到的问题,大家一起解决,一个人搞效率有点慢(我就是这样的),也欢迎各位大佬指教,如果有帮助就慷慨点赞吧(抱拳)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值