
正文
c语言查找节点函数 c语言数据结构查找算法
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
C语言程序,写出一个查找给定值为k的节点的算法
#includestdio.h
#define NULL 0
typedef struct node
{
int key;
struct node *next;
}Node;
Node first;
int main()
{
char c='a';
int k,i,sum=0,flag=0;
Node *p;
p=first;
printf("请输入链表元素(元素之间用空格间隔):\n");
while(c!='\n')
{
scanf("%d",p-key);
p-next=new Node;
p=p-next;
sum++;
c=getchar();
}
p-next==NULL;
printf("请输入要查找的key值:");
scanf("%d",k);
p=first;
printf("查找符合的节点序数为: ");
for(i=0;isum;i++)
{
if(p-key==k)
{
printf("%d ",i+1);
flag=1;
}
p=p-next;
}
if(flag==0)
printf("无\n查找失败!\n");
}
相关问答
Q1: c语言链表怎么通过节点数据查找节点进行插入或更改;
说一下一个大概的思路,首先定义两个指针,一个指针用来向前移动(叫当前指针),另一个指针紧跟其后(叫前驱指针),这个主要用于链表的增删,判断是否要删除当前指针指向的节点,或者增加节点。如果需要删除当前节点,则前驱指针的下一个节点指向当前指针的下一个节点,释放当前指针指向的节点,然后当前指针指向前驱指针的下一个节点,增加也是一样的,一直这样遍历整个链表。至于修改节点数据,那么需要一个当前指针就够了,找到要修改的节点,修改就好了。
闲着没事干,刚写了代码,给你参考一下:
// 删除节点
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;
}
}
下面是运行结果
如果你看理解了这个思路,那么链表的增删查改操作就没有问题了。有用的话点一下采纳,谢谢!!!
Q2: c语言,求节点位置
#include string.h
#include stdio.h
#include stdlib.h//加入三个头文件,删除#DEFINE NULL 0
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node *next;
}Lnode;
Lnode *head;
void insert(ElemType x,int i)
{
int j=1;
Lnode *s,*q;
s=(Lnode *)malloc(sizeof(Lnode));
s-data=x;
q=head;
if(i==1)
{
s-next=q;
head=s;
}
else
{
while((ji-1)(q-next!=NULL))
{
q=q-next;
j++;
}
if(j==i-1)
{
s-next=q-next;
q-next=s;
}
else
printf("位置参数不正确!");
}
}
int locate(Lnode *p,ElemType x)
{
int n=0;
Lnode *q=p;
while(q!=NULL q-data!=x)
{
q=q-next;
n++;
}
if(q=NULL)
{
return(-1);
}
else
{
return(n+1);
}
}
main()
{
Lnode *q;
int d,i,n,select,k,flag;
head = NULL;
printf("请输入数据长度:");
scanf("%d",n);
for(i=1;i=n;i++)
{
printf("将数据加入到链表中:");
scanf("%d",d);
insert(d,i);
}
printf("\n输入要查找的数据:");
scanf("%d",d);//这里小了个
k=locate(head,d);
printf("%d\n",d);
}
Q3: C语言如何查找要删除的节点并删除
temp=p;
p=p-next;
temp-next=NULL;
这三句存在问题c语言查找节点函数,temp=p,让temp指向p所指向c语言查找节点函数的节点,p=p-nextc语言查找节点函数,p指向后移
temp-next=NULL,让tempc语言查找节点函数的后继为空,这里出c语言查找节点函数了问题,链表从temp指向的节点断开,相当于删除p之后的所有节点。
应该先判断p是不是最后节点
if(p-next==NULL)
如果是,只好去找p的前趋pre,让pre-next=NULL,free(p)
如果不是最后节点,将p的后继节点数值域复制给p,然后将p的后继节点删除,等同与删除p
p-data=p-next-data;
p-next=p-next-next;
free(p);
Q4: 怎样用C语言从根节点搜索一棵树(非二叉树),找出特定值的节点?最好有代码注释,谢谢!
typedef struct node{
int val; //值
int nc; //子节点个数
struct node * child[16]; //存储子节点指针,假设最大不超过16个
} node;
node *search(node *root,int var) //指定搜索起始根节点和欲搜索的值,返回找到节点的指针
{
int i;
node *t;
if(!root) //若根节点为空,没什么好说的,返回空
return null;
if(root-val==var) //如果根节点满足要求,直接返回
return root;
for(i=0;inc;++i) //否则递归地对其每一颗子树进行搜索
{
t=search(root-child[i],var);
if(t) //在第i棵子树下搜到了,返回找到的节点,否则继续for循环,搜下一棵子树
return t;
}
return null; //所有子树都搜不到,返回空
}
这其实是一个深度优先搜索的过程,用递归实现,代码简洁有效
其实原理和二叉树是一样的,二叉树其实就是nc最大为2的情况,二叉树的先左后右其实就是i的从0到1
c语言查找节点函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言数据结构查找算法、c语言查找节点函数的信息别忘了在本站进行查找喔。





