其他分享
首页 > 其他分享> > 数据结构刷题day7

数据结构刷题day7

作者:互联网

temp = temp->next

我已经完全掌握链表的增删改查了。

最有意思的就是这句temp = temp->next。

透彻的体现了结构体指针的强大,用这句话就能轻松遍历链表。

只能说绝对不是因为偷懒,所有注释全部放在代码里面了。

真不是因为偷懒,因为之前看教程的代码,放到自己电脑上跑竟然报错。后来问了同学,竟然是我把函数的定义内容放在main函数里了,只有python是能这么玩的。

如果之后有人能看到这篇博客,绝对把代码放到编译器里就能跑。

看的教程放在文章末尾了。

#include<stdio.h>
#include<stdlib.h>

typedef struct Link //定义link为一种类型,类似int char
{
	int elem;
	struct Link *next;
	//此处typedef还未生效,此处定义指针(类似 int *p)
	//Q:为啥系统要给指针分不同类型的?反正都是8个字节?
	//A:指针后面的空间几个字节是一个元素?如*(P+1),指向字符和结构体,1所代表的字节就不一样
} link;


//首先,我们来创建一个链表
//Q:为什么这里会有个'*'?
//A:函数名前的是函数返回的值,这里返回类型为link的指向链表的指针
//写多了以后可以在typedef时就创建指向结构体的指针,在此为了清晰用link *
link* initLink()
{
	link* p = (link*)malloc(sizeof(link));//创建头节点
	link* temp = p;//temp为link型临时变量,用于遍历数组

	//生成链表
	for (int i = 1; i < 5; i++)
	{
		link* a = (link*)malloc(sizeof(link));
		a->elem = i;
		a->elem = NULL;
		temp->next = a;//将1号节点的地址存入头节点的指针区域
		temp = temp->next;//将temp指向1号节点,方便2号节点指向1号
	}
	return p;//返回头节点地址
}


//接着,我们来实现在链表中插入元素
//先理清思路,我们拿来一个新的节点,必须先让这个节点指向下一个节点
//如果直接让上一个节点指向新节点,则下一个节点的地址就丢失了
//基于链表的特性,我们无法直接点名某一个节点,每个节点的位置都存在上一个元素中,因此仍然需要遍历
//看的教程上写的用link定义函数,但其实直接用void就可以了

void insert(link* p, int elem, int add)//传入三个参数,头指针,插入元素,插入位置
{
	link* temp = p;//定义临时变量用于遍历
	//找到插入结点
	for (int i = 1; i < add; i++)
	{
		temp = temp->elem;
		if (temp == NULL)
		{
			return;//如果链表太短不符合条件,直接结束
		}
	}
	link* c = (link*)malloc(sizeof(link));//创建要插入的节点c
	c->elem = elem;//先让c指下一个,再让temp指c
	c->next = temp->next;
	temp->next = c;
}


//下面来实现删除链表中的元素
//删除简单,直接找到需要删除的节点,让他的上一个节点指向他的下一个节点即可
//但是为了防止下一个节点的丢失,在遍历到指定结点时,要把其中的指针数据拿出来

void dele(link* p, int delete)//删除第delete个节点
{
	link* temp = p;
	for (int i = 1; i < delete; i++)
	{
		temp = temp->next;
		if (temp == NULL)
		{
			return;//如果链表太短不符合条件,直接结束
		}
	}
	link* fre = temp->next;//我们标记一下需要删除的节点,以便之后释放空间
	temp->next = temp->next->elem;//下一个节点指向上一个
	free(fre);
}


//改查简单点,应该之前写的,算了再写一遍吧
//改
void replace(link* p, int re, int newelem)
{
	link* temp = p;
	for (int i = 1; i < re; i++)
	{
		temp = temp->next;
	}
	temp->elem = newelem;
}
//查
int search(link* p, int target)
{
	link* temp = p;
	for (int i = i; i < target; i++)
	{
		return temp->elem;
	}
}


int main()
{
	//c语言中不能在main函数中定义函数
}
参考教程
结构体基本使用与结构体指针 https://www.runoob.com/cprogramming/c-structures.html
结构体指针 https://blog.csdn.net/huhanze/article/details/43951917
单链表的初始化和增删改查 http://data.biancheng.net/view/5.html
特别鸣谢
给我debug的吉吉

标签:temp,int,day7,next,链表,link,数据结构,节点,刷题
来源: https://www.cnblogs.com/huigugu/p/16030749.html