搜索链接列表中的值

时间:2016-08-03 14:14:25

标签: c linked-list insertion

我对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函数有时会崩溃。任何有关相同的指导都将受到高度赞赏。

提前致谢。

2 个答案:

答案 0 :(得分:1)

考虑一下搜索功能:

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时,你想要返回。但是,您永远不会移动到下一个节点

您只需检查temp->data的值,但除非第一个节点的数据成员等于value,否则while循环是无限的。

为了实际遍历循环,最好做类似的事情:

temp = temp->next;

答案 1 :(得分:0)

您的搜索将无法正常工作,因为在您的while循环中,您没有代码来更改临时值。你只是调整头部。 所以在你的代码中,添加一行代码:temp = temp-&gt; 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;
}
}