指向列表中指针赋值的指针

pointer to pointer assignment in list

#include <stdio.h> 
#include <stdlib.h>
#define ROZ 100
struct lista
{
    char *imie ;
    char *nazwisko;
    long int data;
    struct wsk * next;
};

int add (struct lista** head)
{
    struct lista *wsk;
    wsk=(struct lista*)malloc(sizeof(struct lista));
    long int data;
    wsk->imie=(char*)malloc(ROZ);
    if(wsk-> imie==NULL)
        return -1;
    wsk->nazwisko=(char*)malloc(ROZ);
    if(wsk->nazwisko==NULL)
        return -2;
    printf("podaj imie");
    fgets(wsk->imie,ROZ,stdin);
    printf("podaj nazwisko");
    fgets(wsk->nazwisko, ROZ, stdin);
    printf("podaj date urodzenia");
    scanf("%ld",&data);
    wsk->data=data;
    wsk->next=(*head);
    (*head)=wsk;
}


main()
{
    struct lista *head, *wsk;
    int a, spr;
    while(a!=4)
    {
        printf("Aby wypisac liste wpisz 1, aby dodac wiersz wpisz 2, aby usunac wiersz wpisz 3, aby zakonczyc prace programu wpisz 4");
        scanf("%d",&a);
        if(a==2)
        {
            spr=add(&head);
            {
                if(spr<0)
                    printf("blad");
            }
        }
    }
}

我不知道如何移动列表的头部(29 行),程序无法在那里编译。

struct lista
{
    char *imie ;
    char *nazwisko;
    long int data;
    struct wsk * next;
};

在这里,只需将wsk更改为lista并添加

return 0; 

在函数的末尾add

此外,当您第一次进入 while 循环时,a 没有被初始化,它包含 "Garbage values"。所以,条件 may/may 不成立。要修复它,只需将 while 循环更改为 do...while 循环,因为此循环在检查条件之前至少执行一次。

检查 scanfmalloc 等的 return 值以查看它们是否成功也是一个好习惯。