我有一个分割错误,也许更多后,我运行它,但我不能检查任何其他东西,因为现在。
程序应该是这样工作的:
- 用户输入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
"这样简单的事情不应该成为它失败的原因之一。