单链表代码使用和总结

本文前提:复习链表结构
由于我会直接贴出代码,供大家共同学习,不再赘述链表结构的基础知识。
本文参考博文:
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,有不对的地方可以提出来讨论。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值