本文前提:复习链表结构
由于我会直接贴出代码,供大家共同学习,不再赘述链表结构的基础知识。
本文参考博文:
https://blog.csdn.net/Endeavor_G/article/details/80552680#commentsedit
https://blog.csdn.net/calculate23/article/details/79758845
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//创建链表
typedef struct student
{
int score;
struct student* next;
}LinkList;
//初始化并创建一个n节点的链表
LinkList* creat(int n)
{
LinkList* head;
LinkList* node;
LinkList* end;
head = (LinkList*)malloc(sizeof(LinkList));
end = head;
int i;
for (i=0;i<n;i++)
{
node = (LinkList*)malloc(sizeof(LinkList));
scanf_s("%d",&node->score,sizeof(node->score));
end->next = node;//一次循环从表尾加入一个节点node(i),此时的end应该是新加入的end了,
//所以上次的end->next需要指向新加入的node
end = node;//新加入的node为新的end
}
end->next = NULL;//链表尾端指向NULL
return head;
}
void find(LinkList* list,int x) //寻找
{
LinkList* p = list;
int count = 1;
while (p->next != NULL)
{
if (p->score == x)
{
printf("链表第%d位数据%d找到!\n",count,p->score);
}
p = p->next;
count++;
}
puts("输入的数据没有找到");
}
LinkList* change(LinkList* list, int n ) //修改第n+1个节点的值
{
LinkList* t = list;
int i = 0;
while (i < n && t != NULL) //同时满足链表不是空的且在修改的表之前。
{
t = t->next;
i++;
}
if (i == n)
{
puts("请输入要修改的值");
scanf_s("%d",&t->score,sizeof(t->score));
}
else
{
printf("节点%d不存在",n+1);
}
return list;
}
//删除链表时注意:
//一、判断待删除的节点是否为头结点;
//
//二、注意传入的位置值(n)是否有效;
//
//三、注意链表节点只有一个时的情况。
LinkList* delet(LinkList* list, int n) //此处为代码方法1;
{
LinkList* pdel = NULL;
LinkList* pnew = NULL;
LinkList* temp = list;
int i = 0;
if (list == NULL)
{
printf("链表为空!\n");
return list;
}
if (n == 1)
{
pnew = temp->next;
free(temp);
if (pnew == NULL)
{
return NULL;//节点数为1的删除了就变成了空链表了。
}
else
{
return pnew;
}
}
i++;
while (temp)
{
if (i == n)
{
pdel = temp->next;
temp->next = temp->next->next;
free(pdel);
return list;
}
else
{
temp = temp->next;
i++;
}
}
printf("位置%d处无节点!\n", n);
return list;
}
LinkList* delet1(LinkList* list, int n) //第二种方法
{
LinkList* t = list,*in;
in = (LinkList*)malloc(sizeof(LinkList)); //此处无比初始化
int i = 0;
while (i < n && t != NULL)
{
in = t;
t = t->next; //巧妙在每一次td都是指向了下一个节点
i++;
}
if (t != NULL)
{
in->next = t->next; //此时in->next指向了t->next
free(t);
return in;
}
else
{
puts("节点不存在");
return NULL;
}
return list;
}
void print(LinkList* list)
{
LinkList* p = list;
while (p->next!=NULL)
{
p = p->next;
printf("%d\n",p->score);
}
}
void insert(LinkList* list, int n) //插入节点
{
LinkList* t = list, * in;
int i = 0;
while (i < n && t != NULL)
{
t = t->next;
i++;
}
if (t != NULL)
{
in = (LinkList*)malloc(sizeof(LinkList));
puts("输入要插入的值:");
scanf_s("%d",&in->score,sizeof(in->score));
in->next = t->next;
t->next = in;
}
else
{
puts("要查找的节点不存在");
}
}
int main()
{
LinkList* hu=NULL;
hu = (LinkList*)malloc(sizeof(LinkList));
hu=creat(5);
print(hu);
find(hu,3);
printf("在节点4后插入数据\n");
insert(hu,4);
print(hu);
printf("在节点1处删除数据\n");
hu=delet1(hu,1);
print(hu);
printf("在节点3处删除数据\n");
hu=change(hu,3);
print(hu);
return 0;
}
//运行环境VS2019,有不对的地方可以提出来讨论。