c语言链表怎么通过节点数据查找节点进行插入或更改;
#include<stdio.h>#include<stdlib.h>#include<string.h>structnode{charname[20];node*nex...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
char name[20];
node *next;
};
void main()
{
node *pt = NULL;
while (true)
{
char newname[20];
printf("请输入学生姓名:如果输入quti则退出,输入insert则插入,若输入print则打印当前结果\n");
scanf("%s", &newname);
if (strcmp(newname, "quit") == 0)
{
break;
}
else if (strcmp(newname, "print") == 0)
{
node *p = pt;
while (p != NULL)
{
printf("%-5s", p->name);
p = p->next;
}
printf("\n");
}
else
{
node *p = (node *)malloc(sizeof(node));
strcpy(p->name, newname);
p->next = pt;
pt = p;
}
}
}
以上是一条简单的单向链表;但比如输入了,张三,李四,王五三个数据后,我怎么通过遍历查找其中李四的位置,然后在其更改数据,然后,在李四和王五的中间插入一个新节点;
还有另一个问题,这种链表生成后怎么保存,还有存入的数据放哪。 展开
#include <stdlib.h>
#include <string.h>
struct node
{
char name[20];
node *next;
};
void main()
{
node *pt = NULL;
while (true)
{
char newname[20];
printf("请输入学生姓名:如果输入quti则退出,输入insert则插入,若输入print则打印当前结果\n");
scanf("%s", &newname);
if (strcmp(newname, "quit") == 0)
{
break;
}
else if (strcmp(newname, "print") == 0)
{
node *p = pt;
while (p != NULL)
{
printf("%-5s", p->name);
p = p->next;
}
printf("\n");
}
else
{
node *p = (node *)malloc(sizeof(node));
strcpy(p->name, newname);
p->next = pt;
pt = p;
}
}
}
以上是一条简单的单向链表;但比如输入了,张三,李四,王五三个数据后,我怎么通过遍历查找其中李四的位置,然后在其更改数据,然后,在李四和王五的中间插入一个新节点;
还有另一个问题,这种链表生成后怎么保存,还有存入的数据放哪。 展开
展开全部
说一下一个大概的思路,首先定义两个指针,一个指针用来向前移动(叫当前指针),另一个指针紧跟其后(叫前驱指针),这个主要用于链表的增删,判断是否要删除当前指针指向的节点,或者增加节点。如果需要删除当前节点,则前驱指针的下一个节点指向当前指针的下一个节点,释放当前指针指向的节点,然后当前指针指向前驱指针的下一个节点,增加也是一样的,一直这样遍历整个链表。至于修改节点数据,那么需要一个当前指针就够了,找到要修改的节点,修改就好了。
闲着没事干,刚写了代码,给你参考一下:
// 删除节点
void delete_node_credit(float const credit) {
stu *pre_node = head;
stu *cur_node = head->next;
while ( cur_node ) {
if ( cur_node->credit == credit ) {
pre_node->next = cur_node->next;
free(cur_node);
cur_node = pre_node->next;
} else {
pre_node = cur_node;
cur_node = cur_node->next;
}
}
// 判断是否删除头节点
if ( head->credit == credit ) {
cur_node = head->next;
free(head);
head = cur_node;
}
}
// 新增节点
void insert_node_credit(stu *new_node, float const credit) {
stu *pre_node = head;
stu *cur_node = head->next;
if ( pre_node->credit > credit ) { // 新增节点是头节点
head = new_node;
new_node->next = pre_node;
return;
}
while ( cur_node ) {
if (cur_node->credit < credit && pre_node->credit > credit ) {
pre_node->next = new_node; // 插入新的节点
new_node->next = cur_node;
return;
}
pre_node = cur_node;
cur_node = cur_node->next;
}
// 新增节点插入链表尾部
if ( pre_node->credit < credit ) {
pre_node->next = new_node;
return;
}
}
下面是运行结果
如果你看理解了这个思路,那么链表的增删查改操作就没有问题了。有用的话点一下采纳,谢谢!!!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询