前言:摸索了好久才搞定链表,希望对大家有所帮助
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;
}
四、最终的运行结果为: