我的列表是通过这两个结构实现的。第一个包含列表中的项目,第二个包含列表本身。
typedef Employee Item;
typedef struct ListNodeTag {
Item item;
struct ListNodeTag *next;
} ListNode;
typedef struct {
int size;
ListNode *first;
} List;
我正在尝试使用以下递归函数来反转列表的内容,但是,如果列表中有多个项目,则会出现分段错误。
void Reverse(List *L){
ListNode *q,*p;
q = L->first;
p = q->next;
if(p == NULL)
return;
Reverse(L);
q->next->next = q;
q->next = NULL;}
我认为问题在于,我不是将列表成员作为函数参数传递,而是传递指向列表本身的指针。如何在不传递不同参数的情况下更改此代码以使其工作?
答案 0 :(得分:0)
在将项目追加到列表中时,您是否确保将所有下一个指针初始化为NULL?
另外,当我读到它时,该函数实际上不会递归,因为你总是传递L.换句话说,在第一次调用之后,函数如何知道再向下一步?
答案 1 :(得分:0)
您需要将另一个参数传递给函数,以将递归函数推进到列表的末尾。这可以这样做 -
void Reverse(ListNode *f, List *l){
if(l->first == NULL)
return;
//Last node reached
if(f->next==NULL){
l->first->next = NULL;
l->first = f;
return;
}
ListNode *p,*q;
p = f;
q = f->next;
Reverse(f->next,l);
q->next = p;
}
虽然这个功能有效,但需要大量内存,所以我建议采用迭代方法,就像这个 -
void Reverse(List *l){
ListNode *f = l->first;
ListNode *fn,*fnn;
if(f==NULL)
return;
fn = f->next;
if(fn==NULL)
return;
fnn = fn->next;
while(fnn!=NULL){
fn->next = f;
f = fn;
fn = fnn;
fnn = fnn->next;
}
fn->next = f;
l->first->next = NULL;
l->first = fn;
}