c-未填写该列表



我写了一个方法来反转列表,但结果列表仍然是空的。帮助我们了解问题所在。

反转列表的方法:

void reverseList(pLIST pL){
pNODE pN = pL->top;
pLIST pLReverse = createList();
while(pN){
pNODE pNew = malloc(sizeof(NODE));
pNew->value = pN->value;
if(!pLReverse->top){
pNew->next = NULL;
pLReverse->top = pNew;
}
else{
pNew->next = pLReverse->top;
pLReverse->top = pNew;              
}
pN = pN->next;
}
showList(pLReverse);
}

列表结构:

typedef struct Node{
int value;
struct Node * next;
} NODE, *pNODE;
typedef struct List{
int len;
pNODE top;
} LIST, *pLIST;

打印列表的方法:

void showList(pLIST pL){
if(isEmpty(pL)) printf("Emptyn");
else{
pNODE temp = pL->top;
printf("Length: %dn", pL->len);
while(temp){
printf("Pointer: %ptValue: %dtNext pointer: %pn", temp, temp->value, temp->next);
temp = temp->next;
}
}
}

对于初学者来说,为类似的指针引入别名是个坏主意

typedef struct List{
int len;
pNODE top;
} LIST, *pLIST;

例如,使用这样的别名,您不能声明指向常量列表的指针,因为此声明

const pLIST list;

并不意味着与相同

const struct List *list;

相反,它意味着

struct List * const list;

这不是必须的。

考虑到该申报

pLIST pLReverse = createList();

您似乎在动态地分配列表。并没有必要这么做。列表可以声明为具有自动存储持续时间的对象。

函数reverseList应该反转传递给它的列表本身,而不是在函数中创建新的列表。此外,由于指针pLReverse指向的已创建列表没有释放,因此内存泄漏。

这里有一个演示程序,展示了如何定义函数reverseList

#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int value;
struct Node *next;
} Node;
typedef struct List
{
size_t len;
Node *head;
} List;
void init( List *list )
{
list->len = 0;
list->head = NULL;
}
int pushFront( List *list, int value )
{
Node *new_node = malloc( sizeof( Node ) );
int success = new_node != NULL;
if ( success )
{
new_node->value = value;
new_node->next = list->head;
list->head = new_node;
++list->len;
}
return success;
}
void showList( const List *list )
{
for ( Node *current = list->head; current != NULL; current = current->next )
{
printf( "%d -> ", current->value );
}
puts( "null" );
}
void reverseList( List *list )
{
Node *current = list->head;
list->head = NULL;
while (  current != NULL )
{
Node *new_node = current;
current = current->next;
new_node->next = list->head;
list->head = new_node;
}
}
void freeList( List *list )
{
while ( list->head != NULL )
{
Node *tmp = list->head;
list->head = list->head->next;
free( tmp ); 
}
}
int main(void) 
{
List list;
init( &list );
const int N = 10;
for ( int i = 0; i < N; i++ )
{
pushFront( &list, i );
}
showList( &list );
reverseList( &list );
showList( &list );
freeList( &list );
return 0;
}

程序输出为

9 -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> 0 -> null
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> null

相关内容

  • 没有找到相关文章

最新更新