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; 如果(标题->项目!=值) { 头部=头部->下一步; } 返回值; }
我试图在LinkedList中搜索一个值,并在找到该值时打印出该节点的索引。但是在我的打印列表之后,我的程序刚刚关闭,我甚至没有找到需要我输入我想要搜索的值的部分。我的打印列表有问题吗?首先,您应该检查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 <
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之后在列表创建中使用code>,因此它可以为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;
}