使用指针创建结构

时间:2017-12-14 00:13:33

标签: c pointers linked-list add singly-linked-list

我正在开发一个程序,该程序创建一个具有添加和显示新节点功能的结构。我有一个名为“add”的函数,我用它来创建新节点并将它们发送到struct-> next但是每当我尝试运行我的函数“displayData”时,该函数说我的结构是NULL /空。

这是代码。

    #include <stdio.h>
    #include <stdlib.h>

    typedef struct node *nodePtr;
    struct node {
    int item;
    nodePtr next;
    };
    typedef nodePtr Statistician;

    int input();
    Statistician newStatistician();     //allocates memory to the structure.                 Dynamic allocation
    void add(Statistician s, int x);    //Adds data to the rear
    void displayData(Statistician s);   //prints entire dataset

    int main() {

        int operation, data;
        Statistician s = NULL;

        data = input();                 //get new input
        add(s,data);                    //run add function
        displayData(s);                 //run display function
    }

    int input(){
        int x;
        printf("Enter data: ");
        if (scanf("%d", &x) != 1)
        {
            printf("\n\nInvalid Input!\n\n");
            exit(0);
        }
        return x;
    }

    Statistician newStatistician(){
        Statistician newStat;
        newStat = malloc(sizeof(struct node));
        return newStat;
    }

    void add(Statistician s, int x){
        Statistician newNode = newStatistician();
        newNode->item = x;
        newNode->next = NULL;
        if(s == NULL){
             s = newNode;
             return;
        }
        while (s != NULL) {
            s = s->next;
        }
        s->next = newNode;  
    }

    void displayData(Statistician s){
         Statistician temp = s;
         if(s==NULL){
            printf("\n\nList is EMPTY.");
            printf( "\n\nPress any key.\n" );
            getch();
            return;
         }
        printf( "\n\nThe List:\n" );
        while (temp != NULL) {
            printf(" %d", temp->item);
            temp = temp->next;
        }

        printf( "\n\nPress any key.\n" );
        getch();
        return;
    }

当我使用displayData时,输出为。

       List is EMPTY

1 个答案:

答案 0 :(得分:1)

您必须通过引用传递头节点。否则,更改列表的函数将处理头节点的副本,并且不会更改原始头节点。

例如

void add(Statistician *s, int x)
{
    Statistician newNode = newStatistician();
    newNode->item = x;
    newNode->next = NULL;

    while ( *s != NULL ) s = &( *s )->next;

    *s = newNode;
}

该功能可以像

一样调用
add( &s, data );