数据结构刷题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