我正在尝试实现链接列表。但不幸的是它无法正常工作。我尝试更改代码。它不起作用。插入函数不起作用,当我调用displaylist()函数时,我也没有看到任何东西。请帮帮我。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct node {
int key;
struct node *next;
} node;
struct node *head, *z, *t;
listinit(void)
{
head = (struct node *) malloc(sizeof *head);
z = (struct node *) malloc(sizeof *z);
head->next = z;
z->next = z;
}
delnext(struct node *t)
{
t->next = t->next->next;
}
node *insertafter(int v, struct node *t)
{
struct node *x;
x = (struct node *)malloc(sizeof *x);
x->key = v;
x->next = t->next;
t->next = x;
return x;
};
void displaylist(void)
{
node *curr = head->next;
while(curr != z){
printf("%d -> ", curr->key);
curr = curr->next;
}
printf("\nHappy Coding! :D\n\n");
}
int main(void)
{
listinit();
int cmd = 0,val = 0;
printf("MENU: \n"
"1. INSERT\n"
"2. DELETE\n"
"3. DISPLAY\n");
printf("OPTION> ");
scanf("%d",&cmd);
switch(cmd){
case 1:
printf("Please Enter your Key Value >");
scanf("%d",&val);
insertafter(val, &head);
main();
case 2:
main();
case 3:
displaylist();
main();
}
}
答案 0 :(得分:2)
您的插入功能不起作用,因为您将位置发送到指针。因为该功能只需要指针。
所以改变:
insertafter(val, &head);
To This:
insertafter(val, head);
它会起作用。
第二个问题是你每次都一次又一次地调用main函数会导致listinit()函数被调用并初始化每个指针。所以删除:
main();
在案例中。并尝试使用这样的东西:
do{
switch(cmd){
case 1:
printf("Please Enter your Key Value >");
scanf("%d",&val);
insertafter(val, &head);
break;
case 2:
break;
case 3:
displaylist();
break;
}while(cmd != 0);
现在应该可以了。 并避免main()函数的递归调用,因为它是一个非常糟糕的编程实践,并导致这样的问题。并在使用switch ... case时使用break语句。
谢谢:)