我可以使用 CreatNode 函数返回结构而不是在所有其他函数中重复的步骤吗?

Can I use a CreatNode function to return a struct rather than its steps repeated in All other functions?

提问人:LibyaChampion 提问时间:7/21/2022 最后编辑:Vlad from MoscowLibyaChampion 更新时间:7/21/2022 访问量:86

问:

我想在 C 中制作一个 CreatNode() 函数以供其他函数调用。我正在尝试使用代码,试图达到出色的可读性和功能性。教授有一个 CreatEmptyList() 函数,但没有 CreatNode()。她疏忽大意,没有能力理解概念和 C lagnguage,没有给我答案。

我不需要这种探索和尝试的想法来通过课程,但我的目标是成为一名开发人员,而不是毕业

这是教授的代码:

typedef struct nodetype
{
    int info;
    struct nodetype *next;
} node;
    node *head;

void createemptylist(node *head)
{
    head=NULL;
}

void insertatbeginning(node *head, int item)
{
    node *newNode;
    /* allocate memory for the new node and initialize the data in it*/
    newNode= malloc(sizeof(node));
    newNode->info=item;
    /* assign the value of head to the “next” of newNode*/
    newNode->next=head;
    /* assign the address of newNode to head */
    head=newNode;
}

void insertatend(node *head, int item)
{
    node *newNode;
    newNode=malloc(sizeof(node));
    newNode->info=item;
    newNode->next=NULL;
    if(head==NULL)
      head=newNode;
    else
    {
     node *prev=head;
     while(prev->next!=NULL)
     prev=prev->next;
     prev->next=newNode;
    }
}

所有这些都是她提供的 PDF 中的片段,并不完全是可编译的代码。

这是我正在处理的代码,它不断出现错误:

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

    typedef struct Node{
        int info;
        struct Node *Next;
    }ListNode;

    ListNode CreatNode(ListNode *Head){///These steps not to be repeated using this function
        printf("\n=================\nEntered CreatNode Function");
        ListNode *NewNode;
        NewNode = malloc(sizeof(ListNode));

        return *NewNode;
    }

    void CreatList(ListNode *Head){
        printf("\n=================\nEntered CreatList Function");
        Head = NULL;
    }


    void InserBeg(ListNode *Head, int item){
        ///CreatNode() steps here

        NewNode=CreatNode(&Head);
        NewNode->info = item; ///Inesrt value
        NewNode->Next = Head;///Insert Adress inside Head to the Next point


        Head = NewNode;
        printf("\nFinished InsertBeg Function");
        printf("\nValue inserted is: %d\n=================\n", NewNode->info);
    }

    void Append(ListNode *Head, int item){
        ///CreatNode() steps here
        ///NewNode=CreatNode(Head);
        NewNode ->info = item;
        NewNode ->Next = NULL;
        
        if (Head==NULL){
            Head=ListNode
        }
        else{
            ListNode *Prev=Head;
            while(while->Prev!=NULL){
                Prev = Prev->Next;
            }
            Prev->Next=NewNode;
        }


    }



int main(){
    ListNode *Head;

    CreatList(&Head);
    InserBeg(&Head, 8);


    return 0;
}



错误:

C:\Users\User\Desktop\all\C\Single Linked List test.c|27|error: incompatible types when assigning to type 'ListNode * {aka struct Node *}' from type 'ListNode {aka struct Node}'|

Undeclared NewNode struct errors since it can't see it

关于以不同的方式对我的想法进行编码或使我的代码工作有任何帮助吗?

C 引用 单链接列表 按值传递 函数定义

评论

1赞 MikeCAT 7/21/2022
您的程序有此问题: C 编程:malloc() 在另一个函数中 - 堆栈溢出(不重复,因为存在其他问题)
1赞 Armali 7/21/2022
@LibyaChampion – 传递给有什么意义?&HeadCreatNode

答:

0赞 Vlad from Moscow 7/21/2022 #1

教授提供的代码非常糟糕。

首先,她使用一个全局变量。由于变量是在文件作用域中声明的,因此它已初始化为 null 指针。所以这个函数head

void createemptylist(node *head)
{
    head=NULL;
}

没有多大意义。此外,它不对原始指针执行任何操作,因为它按值接受其参数。也就是说,它处理原始指针值的副本。head

由于这个原因,其他函数是错误的,因为它们不会更改它们按值接受的原始指针。insertatbeginninginsertatendhead

void insertatbeginning(node *head, int item)
{
    //...
    head=newNode;
}

void insertatend(node *head, int item)
{
    //...
    head=newNode;
    //...
}

它们更改原始指针值的副本。

您的函数中也存在同样的问题。

至于功能,那么它没有意义。CreatNode

ListNode CreatNode(ListNode *Head){///These steps not to be repeated using this function
    printf("\n=================\nEntered CreatNode Function");
    ListNode *NewNode;
    NewNode = malloc(sizeof(ListNode));

    return *NewNode;
}

对于初学者,该参数不在函数中使用。您需要将一个整数参数传递给将用作数据成员的初始值设定项的函数。headinfo

您应该返回指向动态分配对象的指针,而不是该类型的对象。否则,该函数将返回动态分配对象的副本,因此该函数将产生内存泄漏。ListNode

在函数中,名称未定义,例如InserBegAppendNewNode

void InserBeg(ListNode *Head, int item){
    ///CreatNode() steps here

    NewNode=CreatNode(&Head);
    //...

并且您正在调用传递不兼容指针类型的表达式的函数,而不是 .ListNode **ListNode *

CreatList(&Head);
InserBeg(&Head, 8);

下面是一个演示程序,演示了如何定义函数和示例。CreateNodeInsertBeg

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

typedef struct Node
{
    int info;
    struct Node *next;
} ListNode;

ListNode * CreateNode( int info )
{
    ListNode *new_node = malloc( sizeof( *new_node ) );

    if ( new_node != NULL )
    {
        new_node->info = info;
        new_node->next = NULL;
    }

    return new_node;
}

int InsertBeg( ListNode **head, int info )
{
    ListNode *new_node = CreateNode( info );
    int success = new_node != NULL;

    if ( success )
    {
        new_node->next = *head;
        *head = new_node;
    }

    return success;        
}

int main( void )
{
    ListNode *head = NULL;

    if ( InsertBeg( &head, 10 ) )
    {
        puts( "New node is added." );
    }
    else
    {
        puts( "Error: not enough memory." );
    }
}

程序输出为

New node is added.

评论

0赞 LibyaChampion 7/23/2022
这条线后面的意义是什么,Append函数呢?如果我最后要创建一个节点,它会是相同的步骤吗?int success = new_node != NULL;