C 程序,在遍历单链表以获取弹出函数时遇到问题



我正在尝试制作一个可以通过推送、弹出和完整功能访问的链表。我相信我已经正确创建了推送函数,但我在实现 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;
}

现在,您可以开始专门针对您的需求。

相关内容

  • 没有找到相关文章

最新更新