在链接列表中搜索值
Searching a value in the linked list
我对C 中的指针不是很满意,并尝试了一段代码在链表中搜索一个值。另外,我制作了在结尾插入(newNode_end)、在开头插入(newNode_begin)和遍历的函数。
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node* next;
}
void newNode_end(node **head,int data)
{
node* node_ptr, *temp;
node_ptr = (node* )malloc(sizeof(node));
node_ptr->data = data;
if((*head)==NULL)
{
(*head) = node_ptr;
node_ptr->next = NULL;
}
else
{
temp = (*head);
while(temp->next!=NULL)
temp = temp->next;
temp->next = node_ptr;
node_ptr->next = NULL;
}
}
void newNode_begin(node **head,int data)
{
node* node_ptr, *temp;
node_ptr = (node* )malloc(sizeof(node));
node_ptr->data = data;
if((*head)==NULL)
{
(*head) = node_ptr;
node_ptr->next = NULL;
}
else
{
node_ptr->next = (*head);
(*head) = node_ptr;
}
}
void traverse(node *head)
{
node* temp;
if(head==NULL)
{
printf("The list is empty\n");
}
else
{
temp = head;
while(temp!=NULL)
{
printf("%d\n",temp->data);
temp = temp->next;
}
}
}
int search_value(node **head,int value)
{
node* temp;
if((*head)==NULL)
{
printf("The list is empty\n");
}
else
{
temp = (*head);
while(temp!=NULL)
{
if(temp->data==value)
{
printf("FOUND\n");
return 0;
}
}
printf("NOT FOUND\n");
return 0;
}
}
int main()
{
node *head = NULL;
int node_data,user_resp,value;
while(1)
{
printf("----------MENU------------\n");
printf("Press 1: ADD NODE IN THE BEGINNING\n");
printf("Press 2: ADD NODE AT THE END\n");
printf("Press 3: TRAVERSE THE LINKED LIST\n");
printf("Press 4: SEARCH A VALUE\n");
printf("Press 5: EXIT\n");
scanf("%d",&user_resp);
switch(user_resp)
{
case 1:
printf("Enter data for node\n");
scanf("%d",&node_data);
newNode_begin(&head,node_data);
break;
case 2:
printf("Enter data for node\n");
scanf("%d",&node_data);
newNode_end(&head,node_data);
break;
case 3:
traverse(head);
break;
case 4:
printf("Enter value to be searched\n");
scanf("%d",&value);
search_value(&head,value);
case 5:
exit(0);
break;
}
}
return 0;
}
代码的插入和遍历功能运行良好,但search_value功能有时会崩溃。任何有关相同的指导将不胜感激。
提前致谢。
想想搜索功能:
int search_value(node **head,int value)
{
node* temp;
if((*head)==NULL)
{
printf("The list is empty\n");
}
else
{
temp = (*head);
while(temp!=NULL)
{
if(temp->data==value)
{
printf("FOUND\n");
return 0;
}
}
printf("NOT FOUND\n");
return 0;
}
}
在您的 while 循环中,您检查是否 temp != NULL
并将 temp 初始化为 head
。看起来你想要实际遍历列表,当找到 value
时,你想要 return。然而,你永远不会移动到下一个节点。
您只需检查 temp->data
的值,但除非第一个节点的数据成员等于 value
,否则 while 循环是无限的。
为了真正遍历循环,最好做类似的事情:
temp = temp->next;
您的搜索将真的不起作用,因为在您的 while 循环中,您没有代码来更改 temp 的值。你只是在调理头部。
所以在你的代码中,添加一行代码:temp = temp->next;在 if 语句的右括号之后。
int search_value(node **head,int value)
{
node* temp;
if((*head)==NULL)
{
printf("The list is empty\n");
}
else
{
temp = (*head);
while(temp!=NULL)
{
if(temp->data==value)
{
printf("FOUND\n");
return 0;
}
temp = temp->next;
}
printf("NOT FOUND\n");
return 0;
}
}
我对C 中的指针不是很满意,并尝试了一段代码在链表中搜索一个值。另外,我制作了在结尾插入(newNode_end)、在开头插入(newNode_begin)和遍历的函数。
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node* next;
}
void newNode_end(node **head,int data)
{
node* node_ptr, *temp;
node_ptr = (node* )malloc(sizeof(node));
node_ptr->data = data;
if((*head)==NULL)
{
(*head) = node_ptr;
node_ptr->next = NULL;
}
else
{
temp = (*head);
while(temp->next!=NULL)
temp = temp->next;
temp->next = node_ptr;
node_ptr->next = NULL;
}
}
void newNode_begin(node **head,int data)
{
node* node_ptr, *temp;
node_ptr = (node* )malloc(sizeof(node));
node_ptr->data = data;
if((*head)==NULL)
{
(*head) = node_ptr;
node_ptr->next = NULL;
}
else
{
node_ptr->next = (*head);
(*head) = node_ptr;
}
}
void traverse(node *head)
{
node* temp;
if(head==NULL)
{
printf("The list is empty\n");
}
else
{
temp = head;
while(temp!=NULL)
{
printf("%d\n",temp->data);
temp = temp->next;
}
}
}
int search_value(node **head,int value)
{
node* temp;
if((*head)==NULL)
{
printf("The list is empty\n");
}
else
{
temp = (*head);
while(temp!=NULL)
{
if(temp->data==value)
{
printf("FOUND\n");
return 0;
}
}
printf("NOT FOUND\n");
return 0;
}
}
int main()
{
node *head = NULL;
int node_data,user_resp,value;
while(1)
{
printf("----------MENU------------\n");
printf("Press 1: ADD NODE IN THE BEGINNING\n");
printf("Press 2: ADD NODE AT THE END\n");
printf("Press 3: TRAVERSE THE LINKED LIST\n");
printf("Press 4: SEARCH A VALUE\n");
printf("Press 5: EXIT\n");
scanf("%d",&user_resp);
switch(user_resp)
{
case 1:
printf("Enter data for node\n");
scanf("%d",&node_data);
newNode_begin(&head,node_data);
break;
case 2:
printf("Enter data for node\n");
scanf("%d",&node_data);
newNode_end(&head,node_data);
break;
case 3:
traverse(head);
break;
case 4:
printf("Enter value to be searched\n");
scanf("%d",&value);
search_value(&head,value);
case 5:
exit(0);
break;
}
}
return 0;
}
代码的插入和遍历功能运行良好,但search_value功能有时会崩溃。任何有关相同的指导将不胜感激。
提前致谢。
想想搜索功能:
int search_value(node **head,int value)
{
node* temp;
if((*head)==NULL)
{
printf("The list is empty\n");
}
else
{
temp = (*head);
while(temp!=NULL)
{
if(temp->data==value)
{
printf("FOUND\n");
return 0;
}
}
printf("NOT FOUND\n");
return 0;
}
}
在您的 while 循环中,您检查是否 temp != NULL
并将 temp 初始化为 head
。看起来你想要实际遍历列表,当找到 value
时,你想要 return。然而,你永远不会移动到下一个节点。
您只需检查 temp->data
的值,但除非第一个节点的数据成员等于 value
,否则 while 循环是无限的。
为了真正遍历循环,最好做类似的事情:
temp = temp->next;
您的搜索将真的不起作用,因为在您的 while 循环中,您没有代码来更改 temp 的值。你只是在调理头部。 所以在你的代码中,添加一行代码:temp = temp->next;在 if 语句的右括号之后。
int search_value(node **head,int value)
{
node* temp;
if((*head)==NULL)
{
printf("The list is empty\n");
}
else
{
temp = (*head);
while(temp!=NULL)
{
if(temp->data==value)
{
printf("FOUND\n");
return 0;
}
temp = temp->next;
}
printf("NOT FOUND\n");
return 0;
}
}