猪猪虾 发表于 2022-3-17 15:00:02

单链表,为什么无法打印节点,看子函数PrintTable即可

本帖最后由 猪猪虾 于 2022-3-17 15:05 编辑

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

/******************************************************
要求:
        定义一个结构体Node,结构体由两部分组成,第一个是它本身的值,第二个是下一个元素的位置
        数组有3个节点,3个节点的关系如下
                0                     1                     2
        node1(5,2)                                node2(7,-1)                                node3(8,1)

        node1是第一个节点,指向的下一个节点的位置是2,也即是node3,node3指向的节点是位置1,也即是node2

********************************************************/

#define Size 10
void getInput(struct Node* node);
void HeadInsert(struct Node** Ptable);
void PrintTable(struct Node* Ptable);
void initialTable(struct Node* Table[]);
void ReleaseTable(struct Node** Ptable);


struct Node
{
        int value;
        int nextNodeIndex;
        struct Node* next;
};

void getInput(struct Node* node)
{
        printf("enter node'value:");
        scanf_s("%d", &node->value);//这是scanf的基本用法,要传入输入变量的地址,node->value是结构体对应的成员
        printf("enter node'value:");//当输入的是是字符串的时候,字符串变量名本身就是首地址
        scanf_s("%d", &node->nextNodeIndex);
}

void HeadInsert(struct Node** Ptable)
{
        //头插法:永远将数据插入链表的头部,称为头插法
        struct Node* temp;

        struct Node* node = new Node;
        if (node == NULL)
        {
                printf("failed to distribute memory....\n");
                exit(1);
        }

        getInput(node);


        if (*Ptable != NULL)//判断传进来的单链表是不是空的,即判断第第一个节点的地址是不是空的
        {
                temp = *Ptable;
                *Ptable = node;
                node->next = temp;
        }
}

void PrintTable(struct Node* Ptable)
{
        struct Node* node;
        int count = 1;
        node = Ptable;

        while (node != NULL)
        {
                printf("node'value: %d\n", node->value);
                printf("enter node'value: %d\n", node->nextNodeIndex);
                printf("\n");
                node = node->next;
                count++;
        }
}

void initialTable(struct Node* Table[])
{
        for (int i = 0; i < Size; i++)
        {
                Table = NULL;
        }
}

void ReleaseTable(struct Node** Ptable)
{
        struct Node* temp;
        for (int i = 0; i < Size; i++)
        {
                if (*Ptable != NULL) //*Ptable这里是解引用,对应第一个节点的地址
                {
                        temp = *Ptable;
                        *Ptable = (*Ptable)->next;
                        free(temp);
                }
        }
}

int main()
{
        struct Node* Table;
        struct Book* ptr = NULL;
        initialTable(Table);

        HeadInsert(Table);

        PrintTable(*Table);

        //Table 的定义是   struct Node* Table;
        //这是一个指针数组,实际上与struct Node** 是相同的数据类型
        //是一个指针数组,存放的是 struct Node* 类型的指针
        //        Table 作为数组名同时也是数组的首地址,而它存放的的是struct Node* 的地址
        ReleaseTable(Table); //* Table[]是指针数组,存放的是指针,Table指代的第一个元素的地址
        return 0;
}

jhq999 发表于 2022-3-17 15:53:46

本帖最后由 jhq999 于 2022-3-17 15:58 编辑

void HeadInsert(struct Node** Ptable)///////主函数传进来的* Ptable=NULL;
{
      //头插法:永远将数据插入链表的头部,称为头插法
      struct Node* temp;

      struct Node* node = new Node;
      if (node == NULL)
      {
                printf("failed to distribute memory....\n");
                exit(1);
      }

      getInput(node);


      if (*Ptable != NULL)//判断传进来的单链表是不是空的,即判断第第一个节点的地址是不是空的
      {
                temp = *Ptable;
                *Ptable = node;
                node->next = temp;
      }
}
int main()
{
      struct Node* Table;
      struct Book* ptr = NULL;
      initialTable(Table);//Node指针数组Table所有的指针初始化成NULL

      HeadInsert(Table);//*Table=NULL传进去的也是NULL

      PrintTable(*Table);

      //Table 的定义是   struct Node* Table;
      //这是一个指针数组,实际上与struct Node** 是相同的数据类型
      //是一个指针数组,存放的是 struct Node* 类型的指针
      //      Table 作为数组名同时也是数组的首地址,而它存放的的是struct Node* 的地址
      ReleaseTable(Table); //* Table[]是指针数组,存放的是指针,Table指代的第一个元素的地址
      return 0;
}
页: [1]
查看完整版本: 单链表,为什么无法打印节点,看子函数PrintTable即可