Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SearchListNode错误 \define\u CRT\u SECURE\u NO\u警告 #包括 #包括 类型定义结构\u列表节点 { 国际项目; 结构_listnode*next; }列表节点; int搜索(ListNode*头,int值); 作废打印列表(列表节点*表头); int main() { ListNode*head=NULL,*temp=NULL; int i=0; int值=0; 而(1) { printf(“输入一个整数:”); scanf(“%d”、&i); 如果(i==-1) 打破 if(head==NULL) { head=malloc(sizeof(ListNode)); 温度=水头; } 其他的 { temp->next=malloc(sizeof(ListNode)); 温度=温度->下一步; } 临时->项目=i; } 印刷品清单(标题); printf(“输入要搜索的值:”); scanf(“%d”,和值); printf(“在索引%d中找到%d的值”,值,搜索(&head,Value)); 返回0; } 作废打印列表(列表节点*头) { while(head!=NULL) { printf(“%d”,标题->项目); 头部=头部->下一步; } printf(“\n”); } int搜索(ListNode*头,int值) { if(head==NULL) 返回NULL; 如果(标题->项目!=值) { 头部=头部->下一步; } 返回值; }_C_List - Fatal编程技术网

SearchListNode错误 \define\u CRT\u SECURE\u NO\u警告 #包括 #包括 类型定义结构\u列表节点 { 国际项目; 结构_listnode*next; }列表节点; int搜索(ListNode*头,int值); 作废打印列表(列表节点*表头); int main() { ListNode*head=NULL,*temp=NULL; int i=0; int值=0; 而(1) { printf(“输入一个整数:”); scanf(“%d”、&i); 如果(i==-1) 打破 if(head==NULL) { head=malloc(sizeof(ListNode)); 温度=水头; } 其他的 { temp->next=malloc(sizeof(ListNode)); 温度=温度->下一步; } 临时->项目=i; } 印刷品清单(标题); printf(“输入要搜索的值:”); scanf(“%d”,和值); printf(“在索引%d中找到%d的值”,值,搜索(&head,Value)); 返回0; } 作废打印列表(列表节点*头) { while(head!=NULL) { printf(“%d”,标题->项目); 头部=头部->下一步; } printf(“\n”); } int搜索(ListNode*头,int值) { if(head==NULL) 返回NULL; 如果(标题->项目!=值) { 头部=头部->下一步; } 返回值; }

SearchListNode错误 \define\u CRT\u SECURE\u NO\u警告 #包括 #包括 类型定义结构\u列表节点 { 国际项目; 结构_listnode*next; }列表节点; int搜索(ListNode*头,int值); 作废打印列表(列表节点*表头); int main() { ListNode*head=NULL,*temp=NULL; int i=0; int值=0; 而(1) { printf(“输入一个整数:”); scanf(“%d”、&i); 如果(i==-1) 打破 if(head==NULL) { head=malloc(sizeof(ListNode)); 温度=水头; } 其他的 { temp->next=malloc(sizeof(ListNode)); 温度=温度->下一步; } 临时->项目=i; } 印刷品清单(标题); printf(“输入要搜索的值:”); scanf(“%d”,和值); printf(“在索引%d中找到%d的值”,值,搜索(&head,Value)); 返回0; } 作废打印列表(列表节点*头) { while(head!=NULL) { printf(“%d”,标题->项目); 头部=头部->下一步; } printf(“\n”); } int搜索(ListNode*头,int值) { if(head==NULL) 返回NULL; 如果(标题->项目!=值) { 头部=头部->下一步; } 返回值; },c,list,C,List,我试图在LinkedList中搜索一个值,并在找到该值时打印出该节点的索引。但是在我的打印列表之后,我的程序刚刚关闭,我甚至没有找到需要我输入我想要搜索的值的部分。我的打印列表有问题吗?首先,您应该检查scanf()的返回值-它返回成功匹配和分配的项目数。只有在检查返回值后,才能确保使用的值有效 但是,问题是您从未正确终止列表,也就是说,您从未将最后一个节点的next设置为NULL。尝试在之后添加此项,而: #define _CRT_SECURE_NO_WARNINGS #include <

我试图在LinkedList中搜索一个值,并在找到该值时打印出该节点的索引。但是在我的打印列表之后,我的程序刚刚关闭,我甚至没有找到需要我输入我想要搜索的值的部分。我的打印列表有问题吗?

首先,您应该检查
scanf()
的返回值-它返回成功匹配和分配的项目数。只有在检查返回值后,才能确保使用的值有效

但是,问题是您从未正确终止列表,也就是说,您从未将最后一个节点的
next
设置为NULL。尝试在
之后添加此项,而

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
typedef struct _listnode
{
    int item;
    struct _listnode *next;
} ListNode;

int search(ListNode *head, int value);
void printList(ListNode *head);

int main()
{
    ListNode *head = NULL, *temp = NULL;
    int i = 0;
    int value = 0;
    while (1)
    {
        printf("Enter a integer: ");
        scanf("%d", &i);
        if (i == -1)
            break;
        if (head == NULL)
        {
            head = malloc(sizeof(ListNode));
            temp = head;
        }
        else
        {
            temp->next = malloc(sizeof(ListNode));
            temp = temp->next;
        }
        temp->item = i;
    }
    printList(head);
    printf("Enter the value to search for: ");
    scanf("%d", &value);
    printf("Value of %d found in index %d",value,search(&head, value));
    return 0;
}

void printList(ListNode *head)
{
    while (head != NULL)
    {
        printf("%d ", head->item);
        head = head->next;
    }
    printf("\n");
}

int search(ListNode *head, int value)
{
    if (head == NULL)
        return NULL;
    if (head->item != value)
    {
        head = head->next;
    }
    return value;
}
不过,就我个人而言,我建议不要这样做。一般来说,如果列表本身在循环的每次迭代后都处于一致状态,则更为优雅。因此,我的建议是:

temp->next = NULL;
这使得
temp
作为指向上一个节点的指针工作,因此您可能希望将其重命名为
prev
。注意检查
scanf()
malloc()
的返回值,以及
sizeof
的操作数:出于维护原因,最好不要对类型进行硬编码。最后,如果愿意的话,请注意现在有一个对
malloc()
的调用。这在概念上更容易理解,因为新节点分配在代码中的相同位置,而不管
head
是否有效

此外,您的
search()
函数也已中断。它假设如果
value
不是第一个节点的值,那么它就是第二个节点的值,而不是您想要的值。此外,您没有返回节点的索引,而是返回值本身。事实上,有一种情况是返回
NULL
(?!)。我怀疑这是没有警告的汇编

你需要这样的东西:

while (1)
{
    printf("Enter a integer: ");
    if (scanf("%d", &i) != 1) {
        /* Deal with invalid input... */
    }
    if (i == -1)
        break;
    ListNode *new_node;
    if ((new_node = malloc(sizeof(*new_node))) == NULL) {
        /* Deal with memory exhaustion */
    }
    new_node->item = i;
    new_node->next = NULL;
    if (head == NULL)
        head = new_node;
    else
        temp->next = new_node;
    temp = new_node;
}

您不会将
temp->next
置于
NULL
这一行
temp=temp->next之后,因此它可以为NULL或任何其他值。当您在
printList()
中迭代列表时,您到达这个随机值指针,您有一个segfault。

感谢您接受我的答案。我编辑了你的文章,从标题中删除了已解决的问题。我们在SO中不使用这种惯例。接受一个答案就足以让别人知道问题已经解决了。
int search(ListNode *head, int value)
{
    int res = 0;
    for (; head != NULL && head->item != value; head = head->next, res++)
        ; /* Intentionally left blank */
    if (head == NULL)
        return -1;
    else
        return res;
}