2011-05-15 51 views
1

这是我的代码。我想打印所有列表数据。但我不能因为当我写while(llist->next != NULL)llist->nextNULL,但我不知道为什么。请帮助我:)链接列表需要帮助不能打印我的数据。想要添加功能。在C - C++

#include <iostream> 
#include <stdlib.h> 
#include <stdio.h> 
using namespace std; 

struct rame 
{ 
    int data; 
    struct rame *next; 
}; 
int main() 
{ 
    struct rame *llist; 
    llist = (rame*)malloc(sizeof(struct rame)); 
    llist->data = 10; 
    llist->next = llist; 
    llist->next->data = 15; 
    llist->next->next->data = 20; 
    llist->next->next->next->data = 25; 
    llist->next->next->next->next = NULL; 
    printf("test\n"); 
    if(llist->next == NULL) 
    printf("%d\n",llist->data); 
    else 
    while(llist->next != NULL) 
    { 
     printf("%d\n",llist->data);   
     llist = llist->next; 
    } 
system("pause"); 
return 0; 
} 

嘿,我做过,但我LOOP不打印最后的数据。帮我:(

#include <iostream> 
#include <stdlib.h> 
#include <stdio.h> 
using namespace std; 

struct rame 
{ 
    int data; 
    struct rame *next; 
}; 
int main() 
{ 
    struct rame *llist; 
    llist = (rame*)malloc(sizeof(struct rame)); 
    llist->data = 10; 
    llist->next = (rame*)malloc(sizeof(struct rame)); 
    llist->next->data = 15; 
    llist->next->next = (rame*)malloc(sizeof(struct rame)); 
    llist->next->next->data = 20; 
    llist->next->next->next = (rame*)malloc(sizeof(struct rame)); 
    llist->next->next->next->data = 25; 
    llist->next->next->next->next = (rame*)malloc(sizeof(struct rame)); 
    llist->next->next->next->next = NULL; 
    printf("test\n"); 
    while(llist->next != NULL) 
    { 
     printf("%d\n",llist->data);   
     llist = llist->next; 
    } 
system("pause"); 
return 0; 
}   

回答

4

在你的代码

llist = (rame*)malloc(sizeof(struct rame)); 
llist->data = 10; 

分配一个内存位置llist,并且这个位置的数据被分配10 接下来你要做:

llist->next = llist; 
llist->next->data = 15; 

第一行分配的next链接llist本身,这使得列表的下面状态

+--------+-----+------+ 
| llist | 10 | next |-----+ 
+--------+-----+------+  | 
    ^      | 
    |      | 
    +-----------------------v 

现在执行llist->next指向llist本身,因此llist->next->data只是地址为list->data,所以值10被更改。

在您已完成的其他链接中,您使用多少次->next->next->....->next并不重要,因为它会指向相同的位置。

要测试该东西,请打印地址llist和地址llist->next。你有地址llistllist->next相同。这意味着llist->datallist->next->data是一样的。并且通过next字段的任何间接数目都是相同的。所以在最终分配llist->data为25后,其他先前分配的值将被覆盖。

在最终的步骤你做: llist->next->next->next->next = NULL;

这实际上使得上面的图来:

+--------+-----+------+ 
| llist | 10 | next |----->NULL 
+--------+-----+------+ 

这导致if(llist->next == NULL)情况是真实的,因此只在第一个节点的内容打印出来,这是您插入的最后一个值= 25

为了获得正确的效果,您需要为每个下一个链接分配一个新节点,例如在你的代码的情况下:

llist = (rame*)malloc(sizeof(struct rame)); 
llist->data = 10; 

llist->next = (rame*)malloc(sizeof(struct rame)); // we allocate a new location which 
               // we point to with the initial llist 
llist->next->data = 15;       // this will now set the data to 15 of 
               // the node which we allocated on 
               // the previous step 

在这种情况下,图变得

+--------+-----+------+  +-----------------+----+------+ 
| llist | 10 | next |----->| newly allocated | 15 | next | 
+--------+-----+------+  +-----------------+----+------+ 

现在你可以做一个链的形式连接做llist->next->next = (rame*)malloc(sizeof(struct rame));llist->next-next->data = 5486

推荐是不是编写一个next链可以将临时变量中的最后一个节点的地址临时存储在临时变量中,如temp,并通过它们访问数据元素,如:

llist = (rame*)malloc(sizeof(struct rame)); 
temp = llist; 
temp->data = 5 
temp->next = (rame*)malloc(sizeof(struct rame)); 
temp = temp->next; //now temp contains the address of the newly allocated node above 
temp->data = 10; 
temp->next = (rame*)malloc(sizeof(struct rame)); 
temp = temp->next; 
temp->data = 15; 
. 
. 

虽然其实你应该有一个环形的东西,如结构如下链接这些

list_head = (rame*)malloc(sizeof(struct rame)); 
temp = list->head; 
while (some condition) 
{ 
    temp->next = (rame*)malloc(sizeof(struct rame)); 
    temp = temp->next; 
    //if this is the last node,we assign null to identify this that there is no more nodes after this. 
    temp->next = NULL; 
    temp->data = value; 
} 

您需要将表头指针存储在一些变量,使之与您可以遍历整个按照链接列出。请注意,如果您丢失了该指针,那么您将无法获取该列表。

+0

对ASCII艺术+1,很好的解释。 – Mat 2011-05-15 13:15:13

+0

+1美丽的可视化! – imbaer 2011-05-15 13:15:39

+0

@Mat,@exasm:谢谢你。特别是对于难以理解和遵循链接的初学者来说,用图像表示形象化这种链接结构是最好的。 – phoxis 2011-05-15 13:18:04

6
llist->next = llist; 

llist的下一个元素是llist本身你没有一个链表本身,只是返回到自身的单个元素所以:。

llist->next->data = 15; 
llist->next->next->data = 20; 
llist->next->next->next->data = 25; 

所有这些修改llist->data和:

llist->next->next->next->next = NULL; 

llist->nextNULL

如果您想建立一个列表,您需要创建新的列表元素(使用malloc)并链接它们。例如:

llist = (rame*)malloc(sizeof(struct rame)); 
llist->data = 10; 
llist->next = (rame*)malloc(sizeof(struct rame)); 
llist->next->data = 15; 
llist->next->next = (rame*)malloc(sizeof(struct rame)); 
llist->next->next->data = 15; 
.... 

你的循环是不正确的:你总是会跳过最后一项,因为它是->next将是空的,所以循环体将无法运行。

struct rame *cursor = llist; 

while (cursor != NULL) { 
    printf("%d\n", cursor->data);   
    cursor = cursor->next; 
} 

你使用第二个指针列表,以便llist保持不变,并在列表标题:指向与

尝试。 (如果你不这样做,你将永远无法找回它,因为它是单向链接。)

+0

hmm thx。但我不知道如何用malloc创建新的列表元素。你可以帮我吗。谢谢:) – Vato 2011-05-15 12:59:27

+0

编辑我的答案,但你已经知道如何做到这一点 - 这就是你如何分配第一项:-) – Mat 2011-05-15 13:03:06

+0

+1为了帮助你颠覆你的代表超过10K :) – ralphtheninja 2011-05-15 13:08:44

0
llist->next->next->next->next = NULL; 

正在的llist->next = NULL因为llist->next = llist; 你需要分配的内存为每个node.for两个节点的列表:

llist = (rame*)malloc(sizeof(struct rame)); 
llist->data = 10; 

struct rame *llist2; 
llist2 = (rame*)malloc(sizeof(struct rame)); 

llist2->data =15; 
llist2->next = NULL; 

llist->next = llist2; 
1
llist->next->next->next->next = NULL; 

您可以设置指针为NULL。

0

为自己画一个包含所有分配的内存/结构和指针的草图。然后你会看到蛇首先在它的尾部咬住,然后它的next被分配NULL。