我正在尝试制作一个可以通过推送、弹出和完整功能访问的链表。我相信我已经正确创建了推送函数,但我在实现 pop 时遇到了问题。我想我已经发现了错误,我无法使用我的 while 循环遍历链表。
这是我的推送功能:
int push(char x){
if(full() == 1) return 1;
else if(full() == 0){
last = malloc(sizeof(struct Node));
aNode = malloc(sizeof(struct Node));
aNode -> next = anchor;
anchor = aNode;
aNode -> data = x;
last -> data = aNode -> data;
last -> next = aNode -> next;
return 0;
}
else{
aNode = malloc(sizeof(struct Node));
aNode -> next = anchor;
anchor = aNode;
aNode -> data = x;
last -> data = aNode -> data;
last -> next = aNode -> next;
return 0;
}
我的弹出函数是:
int pop(){
if(full() == 0) return 0;
else{
curr_ptr = malloc(sizeof(struct Node));
store = malloc(sizeof(struct Node));
curr_ptr = anchor;
while(curr_ptr != NULL){
curr_ptr = curr_ptr -> next;
}
store -> next = ' ';
store -> data = last -> data;
last -> next = curr_ptr -> next;
last -> data = curr_ptr -> data;
free(curr_ptr);
return store -> data;
}
我在 while 循环中遇到分段错误。我尝试了一个替代的while循环,它没有导致任何错误,但由于某种原因从未在代码中执行。我在循环中扔了一个 printf 语句,它从未打印过任何东西。该循环是:
while(curr_ptr -> next != NULL){
curr_ptr = curr_ptr -> next;
}
你永远不会在pop
中分配last
,但你会循环它。将while(curr_ptr/*...*/
环替换为 for (last=anchor; last->next; last=last->next);
会自动last
跳转到最后一个列表成员。但你的双免来自
curr_ptr = anchor;
/* ... */
free(curr_ptr);
虽然curr_ptr
没有指向malloc
ED内存,而是指向anchor
,这很可能是您列表的一部分,不应释放。正如迈克所说,curr_ptr应该分配内存,当它应该指向列表时。实际上,没有理由在pop
函数中分配任何东西!
编辑评论:仅作为有关列表结构的示例,基于您的示例
struct Node {
char data;
struct Node* next;
};
struct List {
struct Node* head;
struct Node* tail;
};
int push(struct List* L, char c);
int pop(struct List* L);
接下来,您可以基本上定义函数(无论 full 可能意味着什么)。
int push(struct List* L, char c)
{
if (L->head == NULL) {
L->head = L->tail = malloc(sizeof(struct Node));
L->head->data = x;
} else {
L->tail->next = malloc(sizeof(struct Node));
L->tail = L->tail->next;
L->tail->data = x;
}
return 1;
}
int pop(struct List* L)
{
struct Node* cur = NULL;
if (L->head == NULL) {
return 0; /* nothing to remove */
} else if (L->head == L->tail) {
free(L->head);
L->head = L->tail = NULL; /* the list is empty now */
} else {
for (cur = L->head; cur->next != L->tail; cur = cur->next);
cur->next = NULL;
free(L->tail);
L->tail = cur;
}
return 1;
}
现在,您可以开始专门针对您的需求。