我写了一个方法来反转列表,但结果列表仍然是空的。帮助我们了解问题所在。
反转列表的方法:
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