提问人:LibyaChampion 提问时间:7/21/2022 最后编辑:Vlad from MoscowLibyaChampion 更新时间:7/21/2022 访问量:86
我可以使用 CreatNode 函数返回结构而不是在所有其他函数中重复的步骤吗?
Can I use a CreatNode function to return a struct rather than its steps repeated in All other functions?
问:
我想在 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
关于以不同的方式对我的想法进行编码或使我的代码工作有任何帮助吗?
答:
教授提供的代码非常糟糕。
首先,她使用一个全局变量。由于变量是在文件作用域中声明的,因此它已初始化为 null 指针。所以这个函数head
void createemptylist(node *head)
{
head=NULL;
}
没有多大意义。此外,它不对原始指针执行任何操作,因为它按值接受其参数。也就是说,它处理原始指针值的副本。head
由于这个原因,其他函数是错误的,因为它们不会更改它们按值接受的原始指针。insertatbeginning
insertatend
head
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;
}
对于初学者,该参数不在函数中使用。您需要将一个整数参数传递给将用作数据成员的初始值设定项的函数。head
info
您应该返回指向动态分配对象的指针,而不是该类型的对象。否则,该函数将返回动态分配对象的副本,因此该函数将产生内存泄漏。ListNode
在函数中,名称未定义,例如InserBeg
Append
NewNode
void InserBeg(ListNode *Head, int item){
///CreatNode() steps here
NewNode=CreatNode(&Head);
//...
并且您正在调用传递不兼容指针类型的表达式的函数,而不是 .ListNode **
ListNode *
CreatList(&Head);
InserBeg(&Head, 8);
下面是一个演示程序,演示了如何定义函数和示例。CreateNode
InsertBeg
#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.
评论
int success = new_node != NULL;
评论
&Head
CreatNode