C 我的链表实现有什么问题?
那么首先呢,, 我必须承认,我真的没有实现链表,嗯,说实话,我最近没有使用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;
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;
}
}