2011-08-13 61 views
1

经过一段时间的打破我的头脑后,我正在寻求帮助。也许我在这里做了一些非常愚蠢的事情。以下是链表的基本实现。但是,它似乎并不奏效。有人可以看看吗?这个链表实现有什么问题?

编辑:通过不工作我的意思是它进入无限循环在添加功能的其他部分。

#include <iostream> 

struct node 
{ 
    int data; 
    node* link; 
}; 

void add(struct node** list, int i) 
{ 
    //populate a node 
    node* tempNode = (node*) malloc(sizeof(node)); 
    tempNode->data = i; //**This does not seem to initialize data** 
    tempNode->link = NULL; //**Same here** 

    //check if the list is empty 
    if(*list == NULL) 
    { 
     //create the node 
     *list = tempNode; 
    } 
    else 
    { 
     while((*list)->link != NULL); //Enters in to an endless loop here because the link is not initialized 
     (*list)->link = tempNode; 
    } 

} 

void print(node** list) 
{ 
    node* itr = *list; 
    while(itr != NULL) 
    { 
     std::cout << itr->data << "\n"; 
     itr = itr->link; 
    } 
} 

int main() 
{ 
    node* linkedList = NULL; 
    node** t = &linkedList; 
    add(&linkedList, 10); 
    add(&linkedList, 20); 
    add(&linkedList, 30); 
    add(&linkedList, 40); 
    print(&linkedList); 

} 
+1

请你的意思是“不行”是什么更多的描述。我们看不懂头脑:) – hugomg

+0

对不起我的坏。将其添加到编辑 – koobi

+2

在一般情况下,您应该检查'malloc'是否返回NULL以防止出现分段错误。 – keks

回答

2

您的add功能有误(else分支)。由于(*list)->link未发生变化,因此会永久循环。尝试这个。

void add(struct node** list, int i) 
{ 
    /* .... */ 
    if(*list == NULL) 
     *list = tempNode; 
    else { 
     struct node *p = *list; 
     /* Search for tail. */ 
     while(p->link) 
      p = p->link; 

     /* Since p->link is NULL, it's the tail. */ 
     p->link = tempNode; 
    } 
} 

这插入O(n); user786653在评论中有一个很好的建议。

+2

+1击败拳头。同样,因为这样每次人们通常在列表的开始处插入列表或保留尾指针以避免行走时,这些列表都会走路。 – user786653

+1

@ user786653我喜欢用“head”和“tail”来保留'struct' :-) – cnicutar

+0

另外,我们不再需要'if..else'。 – keks

0

试试这个在add()

else 
    { 
     struct node *n = *list; 
     while (n->link != NULL) 
      n = n->link; 
     n->link = tempNode; 
    } 
0

这里是一个工作版本。我不确定,但可能是这样的情况,阅读本文并将其与您的内容进行比较将会告诉您更多的东西,而不是阅读对差异的分析。

#include <iostream> 

struct node { 
    int data; 
    node* link; 
}; 

void add(struct node** list, int i) 
{ 
    // populate a node 
    node* tempNode = (node *)malloc(sizeof(node)); 
    tempNode->data = i; 
    tempNode->link = NULL; 

    //check if the list is empty 
    if(*list == NULL) 
    *list = tempNode; //create the node 
    else { 
    while((*list)->link != NULL) 
     list = &(*list)->link; 
    (*list)->link = tempNode; 
    } 
} 

void print(node** list) 
{ 
    node* itr = *list; 
    while(itr != NULL) { 
    std::cout << itr->data << "\n"; 
    itr = itr->link; 
    } 
} 

int main() 
{ 
    node* linkedList = NULL; 
    add(&linkedList, 10); 
    add(&linkedList, 20); 
    add(&linkedList, 30); 
    add(&linkedList, 40); 
    print(&linkedList); 
} 
1

,而((*名单) - >链接!= NULL); //进入一个无限循环,因为链接没有初始化

那么,你不应该尝试使用未初始化的值;确保它首先被初始化。

但很明显,问题发生在任何非空值:循环内部没有办法改变值,所以它将永远是非空的。也许你应该重新思考逻辑?这段代码应该做什么,为什么?

(我故意不回答,直接,所以你可以做你自己的想法 - 这是一个重要的技能。)