我应该用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;
}