嵌入式技术
上期介绍了动态链表怎么建立,以及使用循环的方式怎么输出整个链表中各个节点的数据,这期主要讲解 链表的删除、修改以及插入 !
关键词:链表的删除;链表的修改;链表的插入;
01链表的基本操作
修改链表节点值很简单,只需要在指定地址修改节点数据就可以了,下面是一个传入链表和要修改的节点,来修改值的函数,代码如下:
void change(TYPE* head, int n) //修改指定位置的结点的信息
{
TYPE* p = head; //传入首地址
int i = 0;
while (i < n && p != NULL) {
p = p->next;
i++;
} //找到相应的位置结点
if (p != NULL) {
printf("输入要修改的值\\n");
scanf("%ld,%f", &p->num, &p->score);//输入下一个结点信息
}
else
printf("节点不存在\\n");
}
主函数的代码如下:
int main()
{
TYPE* pt; //定义一个结构体指针变量
pt = Creat(); //函数返回链表第一个结点的地址
change(pt,2); //修改相关结点的信息,假设修改第2+1个
print(pt); //输出调用
return 0;
}
这次没有通过打印的方式显示输出界面,希望读者可以自己打印信息,验证对错。
删除链表的元素也就是把前节点的指针域越过要删除的节点指向下下个节点。即:p->next = q->next;然后放出q节点的空间,即free(q), 操作如图1-1所示:
图1-1 链表删除结构图
删除函数的代码如下:
void delet(TYPE* head, int n) {
TYPE* p = head, * in; //定义两边指针
int i = 0;
while (i < n && p != NULL) {
in = p; //找到左边的
p = p->next; //找到右边的
i++;
}
if (p != NULL) {
in->next = p->next; //将左右链接
free(p); //释放中间结点
}
else {
printf("节点不存在\\n");
}
}
主函数的代码如下:
int main()
{
TYPE* pt; //定义一个结构体指针变量
pt = Creat(); //函数返回链表第一个结点的地址
delet(pt,1); //删除第1+1个结点
print(pt); //输出调用
return 0;
}
链表修改的显示结果如图1-2所示:
图1-2 链表删除显示结果
图1-2是删除第三个节点后显示的输出结果。
从图1-3可以看出来,插入节点就是用插入前节点的指针域链接上插入节点的数据域,再把插入节点的指针域链接上插入后节点的数据域。根据图1-3,插入节点也就是:e->next = head->next; head->next = e;增加链表节点用到了两个结构体指针和一个int数据。
图1-3 链表的插入操作图
插入函数的代码如下:
void insert(TYPE* head, int n) { //链表的插入
TYPE* p = head, * in;
int i = 0;
while (i < n && p != NULL) {
p = p->next;
i++; //找到相应结点
}
if (p != NULL) {
in = (TYPE*)malloc(sizeof(TYPE)); //开辟新的空间
printf("输入要插入的值\\n");
scanf("%ld,%f", &in->num, &in->score);//输入新的结点信息
in->next = p->next;//填充in节点的指针域,也就是说把in的指针域指向p的下一个节点
p->next = in; //填充p节点的指针域,把p的指针域重新指向in
}
else {
printf("节点不存在\\n");
}
}
主函数的代码如下:
int main()
{
TYPE* pt; //定义一个结构体指针变量
pt = Creat(); //函数返回链表第一个结点的地址
insert(pt, 1); //从1+1后插入
print(pt); //输出调用
return 0;
}
系统输出结构界面如下:
图1-4 插入链表显示界面
02软件使用遇到的问题
出现scanf 和printf 在VS2019中使用时会出错,解决办法如图1-5和图1-6所示:
图1-5 右键源程序属性
图1-6 在属性中选择SDL检测为否
全部0条评论
快来发表一下你的评论吧 !