gpt4 book ai didi

c - 链接列表出现问题,程序将无法打印元素

转载 作者:行者123 更新时间:2023-11-30 16:14:32 24 4
gpt4 key购买 nike

我应该用 C 编程语言做作业。它包括链接列表和从控制台读取用户输入。

用户在控制台中输入数字,例如( 1 3 5 7 0 ),这些数字将被一一添加到链表的开头。 0 标记转换结束。这就是第一部分之后链表的样子:7 5 3 1

我需要编写两个不同的函数来删除链表的不同元素。

第一个函数从列表中删除具有您输入的值的所有元素,第二个函数删除用户输入位置上的元素(如果存在)。

最后,您应该打印列表。

我已经正确地编写了第一个函数,并且我确信这一点,但对于第二个函数(删除某个位置上的元素的函数)我遇到了一些麻烦。我做了一个简单的函数来计算总共有多少个节点,所以如果有人输入的数字大于节点的数量,就会弹出一条消息。我还使用该函数创建了一个 for 循环,并将其用作在某个位置搜索元素时的限制(如果这有意义的话)。该程序也不会打印任何内容,我不知道为什么。

    typedef struct Element Element;

struct Element
{
int number;
Element *next;
};

Element *addnewN(int number)
{
Element *newN = (Element*)malloc(sizeof(Element));

newN->number = number;
newN->next = NULL;

return newN;
}

Element *add_on_beginning(Element *head, Element *newN)
{
newN->next = head;

return head;
}

Element* delete_value(Element* head, int value)
{
Element *before = NULL;
Element *temp = head;
Element *newNhead = head;

while(temp != NULL)
{
if(temp->number == value)
{
if(before == NULL)
{
newNhead = temp->next;
free(temp);
temp = newNhead;
}
else
{
before->next = temp->next;
free(temp);
temp = before->next;
}
}
else
{
before = temp;
temp = temp->next;
}

}
return newNhead;
}

int counter(Element *head)
{
int count = 0;
Element *temp = head;

while(temp != NULL)
{
count++;
temp = temp->next;
}
return count;
}

Element* delete_on_position(Element* head, int position)
{
int limit = counter(head);

Element *temp = head;
Element *newNhead = head;
Element *before = NULL;

if(position > limit)
{
printf("Error.\n");
}

for(int i = 0; i < limit; i++)
{
if(position == 0)
{
newNhead = temp->next;
free(temp);
temp = newNhead;
}
else if(position == i)
{
before->next = temp->next;
free(temp);
temp = before->next;
}
else
{
before = temp;
temp = temp->next;
}
}
return head;
}

void printElement(Element *element)
{
printf("%d ", element->number);
}

void printList(Element *head)
{
Element *temp = head;

while(temp != NULL)
{
printElement(temp);
temp = temp->next;
}
}

void menu()
{
printf("\t MENU \n");
printf("1. Delete all elements from the list that have the value that
you input.\n");
printf("2. Delete the element on the position, if it exists.\n");
printf("3. Print the list. \n");
printf("4. Exit \n");
}

int main()
{
Element *head = NULL;

int i = 0;
int arr[1000];
char temp;
int x;
int y;

printf("Input the numbers you want: \n");

while(temp != '\n')
{
scanf("%d%c", &arr[i], &temp);

if(arr[i] == 0)
{
break;
}

head = add_on_beginning(head, addnewN(arr[i]));

i++;
}

menu();

while(1)
{
scanf("%d", &x);

switch(x)
{
case 1:
{
scanf("%d", &y);
head = delete_value(head, y);
break;
}
case 2:
{
scanf("%d", &y);
head = delete_on_position(head, y);
break;
}
case 3:
{
printList(head);
break;
}
case 4:
{
return 0;
}
}

}

return 0;

}

您应该得到的内容例如:

输入:2 4 5 8 5 0(一行),各一行:

2
2
1
5
3

输出:2 8

调试时,代码没有显示任何错误。

最佳答案

add_on_beginning 未返回正确的值。它应该返回添加的节点,因为它是列表的新头。因此,其他任何东西都无法正常工作,因为 head 将始终为 NULL

Element *add_on_beginning(Element *head, Element *newN)
{
newN->next = head;

return newN;
}

关于c - 链接列表出现问题,程序将无法打印元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57596781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com