В main
do {
if(i==1)
{
...
}
else if ( i==2)
traverse(temp);
}
while(i!=3);
должно быть что-то вроде
do {
if (scanf("%d", &i) != 1)
break;
if(i==1)
{
...
}
else if ( i==2)
traverse(temp);
}
while(i!=3);
, чтобы знать, чего хочет пользователь (я не инициализирован в вашем коде)
in create
scanf("%s", &c);
неправильно, потому что c является char , а не строкой
Doне смешивайте чтение int и char , потому что вы будете читать символы новой строки и пробела при чтении символа, поэтому читайте строку для c , например
char c[2];
...
scanf("%1s", &c);
if (*c == 'y')
...
else if (c == 'n')
...
возврат в иначе ветвь бесполезна, и в случае, если ответ не 'y' или 'n', вы ничего не делаете, поэтому не устанавливаете temps , вероятно, вам нужно просто проверить, если 'y', и все остальные ответы следует считать 'n', или вам нужно снова спросить о выборе
в create вы назначаете локальную переменную temps , которая не влияет на pb в main , вам нужно получить node**
например
in main temp используетсяно никогда не устанавливается в другом месте, а переменные j, k, l, m, n бесполезны.Вы также запрашиваете data в main , в то время как вы также делаете в create , не должны выполняться в main .То, как вы управляете своими переменными, не позволяет вам изменять / распечатывать список
Я призываю вас не использовать глобальные переменные, которые вы можете, и не использовать одно и то же имя для глобальной и локальной переменных, таких как вы.сделайте для temp и head , потому что это не поможет читателю вашего кода
Предложение, решающее проблемы:
#include <stdlib.h>
#include <stdio.h>
struct node
{
int a;
struct node * b;
};
/* flush input up to the end of the line */
void flush()
{
int c;
while ((c = getchar()) != '\n') {
if (c == EOF)
exit(-1);
}
}
void create (struct node ** l)
{
/* go to the end of the list */
while (*l != NULL)
l = &(*l)->b;
for (;;) {
char c[2];
int v;
printf("enter data\n");
if (scanf("%d", &v) != 1) {
puts("invalid value");
flush();
}
else {
*l = malloc (sizeof(struct node));
(*l)->a = v;
(*l)->b = NULL;
l = &(*l)->b;
for (;;) {
printf("do you want to insert another node y/n\n");
scanf("%1s", c);
if (*c == 'y')
break;
else if (*c == 'n')
return;
}
}
}
}
void traverse ( struct node *head)
{
while(head != NULL)
{
printf("%d ",head->a);
head = head->b;
}
putchar('\n');
}
int main ()
{
int i;
struct node *head = NULL;
for (;;) {
puts("enter choice : 1 to create new node, 2 to print list, 3 to exit");
if (scanf("%d", &i) != 1)
flush();
switch(i) {
case 1:
create(&head);
break;
case 2:
traverse(head);
break;
case 3:
return 0;
default:
break;
}
}
}
Компиляция и выполнение:
/tmp % gcc -pedantic -Wextra -Wall t.c
/tmp % ./a.out
enter choice : 1 to create new node, 2 to print list, 3 to exit
2
enter choice : 1 to create new node, 2 to print list, 3 to exit
1
enter data
11
do you want to insert another node y/n
y
enter data
22
do you want to insert another node y/n
n
enter choice : 1 to create new node, 2 to print list, 3 to exit
2
11 22
enter choice : 1 to create new node, 2 to print list, 3 to exit
1
enter data
3
do you want to insert another node y/n
n
enter choice : 1 to create new node, 2 to print list, 3 to exit
2
11 22 3
enter choice : 1 to create new node, 2 to print list, 3 to exit
4
enter choice : 1 to create new node, 2 to print list, 3 to exit
3
Я призываю вас добавить свободный список