【问题标题】:What is wrong with my linked list implementation?我的链表实现有什么问题?
【发布时间】:2012-09-29 17:29:46
【问题描述】:

嗯,首先, 不得不承认,我真的没有实现链表,嗯,说实话,我最近没用过C。

所以我确信这是一个非常愚蠢的简单错误。

嗯(不知道为什么——但我就是喜欢这个词), 我试着刷新一下思路,然后我决定实现一些简单的链表。

void addToLast(linkedList* head, int data) {
    linkedList* ptr = head; // points to ptr
    while(ptr) /* p ins't null */ ptr = ptr->next;
    // ptr now is null
    ptr = (linkedList*)malloc(sizeof(linkedList)); // we have new node
    if(ptr == NULL) printf("DAFUQ Null\n");
    ptr->num = data;
    ptr->next = NULL;
//  return!
    return;
}

好吧,出于某种奇怪的原因,每次迭代 ptr 的值都是 NULL。

似乎每当我调用addToLast 函数时,ptr 都保持为空。

我真的不知道为什么 - 我真的很累,或者我只是有一个愚蠢的问题。

好吧,正如我所说的 - 我不明白为什么 ptr 保持为 NULL,

我分配了一个新节点 -

ptr = (linkedList*)malloc(sizeof(linkedList)); // we have new node

那么为什么 ptr 不保存它的值呢?

主要&打印功能:

void printList(linkedList* list) {
linkedList* p;
putchar('[');
for(p = list;p;) {
    printf("%d, ",p->num);
    p = p->next;
}
putchar(']');

}

int main() {
    // create list
    linkedList *root = (linkedList*)malloc(sizeof(linkedList));
    root->next = NULL;
    addToLast(root,0);
    addToLast(root,5);
    printList(root);
    system("pause");
    return 0; // blet :o
}

【问题讨论】:

  • 除了内存泄漏,一点也不多。你遍历 *next 指针直到你到达一个空值,创建一个新节点,然后分配它....嗯.. 无处可去?

标签: c visual-studio-2010 linked-list


【解决方案1】:

在您的函数中,您永远不会分配下一个上一个元素,并且当 ptr 指向 null 时停止循环,您必须在此之前停止

void addToLast(linkedList* head, int data) {
    linkedList* ptr = head; // points to ptr
    linkedList* last= null; // new element

    last = (linkedList*)malloc(sizeof(linkedList)); // we have new node
    if(last == NULL) 
        printf("DAFUQ Null\n");

    last ->num = data;
    last ->next = NULL;

    while(ptr->next!=null) 
        ptr = ptr->next;

    ptr->next=last;
}

【讨论】:

  • 这取决于你想要什么样的行为,如果你的头指针可能为空,你必须对函数进行一些修改
  • 这将是我在这一切结束时发布的 impl。我想他很快就会明白的。
【解决方案2】:

好吧,问题是列表中的最后一个节点仍然指向NULL。您必须保存最后一个节点:

void addToLast(linkedList* head, int data) {
    linkedList* ptr = head, *last; // points to ptr
    while(ptr) /* p ins't null */ {
        last = ptr;
        ptr = ptr->next;
    }
    // ptr now is null
    ptr = (linkedList*)malloc(sizeof(linkedList)); // we have new node
    if(ptr == NULL) printf("DAFUQ Null\n");
    ptr->num = data;
    ptr->next = NULL;
    last->next = ptr;
//  return!
    return;
}

或者那样

void addToLast(linkedList* head, int data) {
    linkedList* ptr = head;
    while(ptr->next) ptr = ptr->next;
    ptr->next = (linkedList*)malloc(sizeof(linkedList)); // we have new node
    if(ptr == NULL) printf("DAFUQ Null\n");
    ptr->next->num = data;
    ptr->next->next = NULL;
 }

【讨论】:

    【解决方案3】:
    void addToLast(linkedList **head , int data){
    linkedList *temp, *r;
    temp = *head;
    
    if(*head == NULL)//list is empty create first node
    {
    temp = malloc(sizeof(linkedList));
    temp->num = data;
    temp->next = NULL;
    *head = temp;
    }
    else
    {
    
    //go to last node    
    while(temp->next!=NULL)
    temp = temp->next;
    
    //add node at end
    r = malloc(sizeof(linkedList));
    r->num = data;
    r->next = NULL;
    temp->link = r;
    }
    }
    

    我只是将指针头作为指针传递给linkdList **head而不是linkedList *head

    【讨论】:

      猜你喜欢
      • 2017-11-28
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 2019-06-07
      • 2021-07-25
      相关资源
      最近更新 更多