0

我有一个分段错误,在我运行它之后可能会更多,但我现在无法检查其他任何内容。

该程序应该像这样工作:

  • 当用户输入5个数字时,他们应该按升序打印出来
  • 如果用户输入的数字已经退出,则去掉原来的值
  • 如果用户输入本机值,则打印 List Backwards

到目前为止,这是我的代码:

#include <stdio.h>
#include <stdlib.h>

struct element {
int i;
struct element *next;
};

void insert (struct element **head, struct element *new)
{

struct element *temp;
temp = *head;

while(temp->next != NULL)
{
    if((*head==NULL))
    {
    head = malloc(sizeof(struct element));
    //temp->i = i;
    temp->next = new;
    new = temp;
    }
    else if(temp->i == new->i)
    {
        new = malloc(sizeof(struct element));
        free(new);
        //purge(&head,&new);

    }
    else if(temp->i < new->i)
    {
        temp->i = new->i;
    }
    else if(temp->i > new->i)
    {
        new = new->next;
    }
}

}

void purge (struct element *current, struct element *predecessor)
{

predecessor->next = current -> next;
free(current);
}

void printList (struct element *head) 
{
while(head)
{
    printf("%d", head -> i);
    head = head->next;
}

}

void printListBackwards (struct element *ptr)
{
if(ptr == NULL)
{
    printf("list is empty \n");
    return;
}
if(ptr->next != NULL)
{
    printListBackwards(ptr->next);
}
printf("print %p %p %d\n", ptr, ptr->next, ptr->i);
}


int main()
{
int n = 0;
int count = 5;
printf("enter a Number: \n");
scanf("%d",&n);
struct element *new;
new = malloc(sizeof(struct element));
struct element *head = NULL;
new->i = n;
while(count!=0)
{
    insert(&head,new);
    printList(head);    
    count++;
}

}
4

3 回答 3

1

在该main()函数中,您只需使用 ; 分配和创建一个元素malloc()。然后您尝试将其添加到您的列表中 5 次。这会引起混乱。您应该为添加到列表中的每个元素分配一次节点。

struct element *head = NULL;

while (count!=0)
{
    printf("enter a Number: \n");
    if (scanf("%d", &n) != 1)
        break;
    struct element *new = malloc(sizeof(struct element));
    if (new == 0)
        break;
    new->i = n;
    new->next = NULL;
    insert(&head, new);
    printList(head);    
    count--;
}

请注意,修改后的代码会检查 和 的scanf()结果malloc()。它还将新元素的next指针设置为 NULL。它倒计时而不是倒计时;这可能会使用更少的内存。

我没有对此进行测试,因此可能存在(并且很可能存在)其他问题,但这可能会更好(解决一些问题,但不是所有问题)。

您确实需要学习如何使用调试器,至少足以获取堆栈跟踪,以便您知道哪一行代码导致了崩溃。

于 2013-04-05T00:21:13.883 回答
1

你真的需要一个链表吗?似乎问题陈述说用户只能输入 5 个数字......如果是这样,为什么不只使用 5 个元素的数组?以下是一些想法。

enum { N = 5 };
typedef struct Element {
    int number;
    bool present;
} Element;

Element elements[ N ];

Init:
for( i = 0; i != N; ++i ) {
    elements[i].number = 0;
    elements[i].present = false;
}

Insert "inputNumber":
for( i = 0; i != N; ++i ) {
    if( elements[i].present == false ) {
        elements[i].number = inputNumber;
        elements[i].present = true;
    }
}

Remove "removeNumber":
for( i = 0; i != N; ++i ) {
    if( elements[i].number == removeNumber ) {
        elements[i].present = false;
    }
}

Print Backwards:
for( i = N; i != 0; --i ) {
    printf( "%d\n", elements[i].number );
}
于 2013-04-05T00:25:00.540 回答
0

在 main 中,您应该设置new->next = NULL;[或插入开头的某处]

这段代码只是搞砸了:

head = malloc(sizeof(struct element));
//temp->i = i;
temp->next = new;
new = temp;

您可能应该设置

*head = new; 

但是你还需要设置*head->next = NULL;

这一点完全是胡说八道:

    new = malloc(sizeof(struct element));
    free(new);
    //purge(&head,&new);

你会想要释放new.

else if(temp->i < new->i)
{
    temp->i = new->i;
}
else if(temp->i > new->i)
{
    new = new->next;
}

这也是大错特错的。我认为最后一个应该做

   temp = temp->next; 

帮自己一个忙,在一张纸、盒子上画

  HEAD 
   !
   v
 +-----+
 ! i=3 !
 +-----+     +-----+
    !------->! i=4 !
             +-----+
                !-------->NULL

然后遍历它,看看你的代码是如何插入、删除等的。

[我也可以建议您不要在代码中使用 C++ 保留字 -new是 C++ 保留字。这意味着您的代码肯定不会在 C++ 编译器中编译,这是一件不好的事情。当然,还有其他一些事情可能需要改变,但是像“不调用变量new”这样简单的事情不应该是它失败的事情之一]。

于 2013-04-05T00:33:34.310 回答