C 我的链表实现有什么问题?

C 我的链表实现有什么问题?,c,visual-studio-2010,linked-list,C,Visual Studio 2010,Linked List,那么首先呢,, 我必须承认,我真的没有实现链表,嗯,说实话,我最近没有使用C 所以我确信这是一个非常愚蠢的简单错误 嗯(不知道为什么-但我只是喜欢这个词), 我试图刷新一下我的思维,然后我决定实现一些简单的链表 void addToLast(linkedList* head, int data) { linkedList* ptr = head; // points to ptr while(ptr) /* p ins't null */ ptr = ptr->next;

那么首先呢,, 我必须承认,我真的没有实现链表,嗯,说实话,我最近没有使用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的值都是空的

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

我真的不知道为什么——要么我真的很累,要么我只是有个愚蠢的问题

就像我说的-我不明白为什么ptr保持空值

我分配一个新节点-

ptr = (linkedList*)malloc(sizeof(linkedList)); // we have new node
那么为什么ptr不保存它的价值呢

主要打印功能(&p):

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


在您的函数中,您从不分配上一个元素中的下一个,当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;
}

问题是列表中的最后一个节点仍然指向
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;
 }

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

,除了内存泄漏之外,没有太多。您遍历*下一个指针,直到到达空值,创建一个新节点,并分配它…嗯。。哪里都没有?这取决于你想要什么样的行为,如果你的头指针可能是空的,你必须对函数进行一些修改,这将是我在这一切结束时发布的impl。我想他很快就会明白的。
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;
 }
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;
}
}