我在C语言中有一个分割错误



我有一个分割错误,也许更多后,我运行它,但我不能检查任何其他东西,因为现在。

程序应该是这样工作的:

  • 用户输入5个数字时,按升序输出
  • 如果用户输入的号码已经退出,则删除原值
  • 如果用户输入本地值,则向后打印列表

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

#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 %dn", 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++;
}
}

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。它倒数而不是向上;这可能会使用更少的内存

我没有测试过这个,所以可能有(很可能是)其他问题,但这可能会更好地工作(修复一些问题,但不是所有问题)。

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

你真的需要链表吗?问题说明似乎说用户只能输入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( "%dn", elements[i].number );
}

在main中,您应该设置new->next = NULL;[或在insert开头的某个地方]

这段代码有点乱:

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"这样简单的事情不应该成为它失败的原因之一。

最新更新