2016-09-16 176 views
-3

我是新來的鏈接list..My簡單的代碼是創建鏈接列表,並在年底插入節點並遍歷它..
我的問題是 -
1)-Every時間插入功能叫,頭指針變空
2)-not工作的權利,而在播放功能去..遍歷鏈表

提前

#include<iostream> 
#include<malloc.h> 
using namespace std; 

struct linkedList 
{ 
    int value; 
    linkedList *next; 
}; 
linkedList* head = NULL; 
void insert(linkedList* head, int data) 
{ 

    linkedList *ptr; 
    linkedList *node; 
    node = (linkedList*) malloc(sizeof(struct linkedList)); 
    node->value = data; 
    node->next = NULL; 
    if (head == NULL) 
    { 

     head = node; 

    } 
    else 
    { 
     ptr = head; 
     while (ptr != NULL) 
     { 
      ptr = ptr->next; 
     } 
     ptr = node; 
    } 
} 
void show(struct linkedList *head) 
{ 

    struct linkedList *ptr; 
    ptr = head; 

    while (ptr != NULL) 
    { 
     cout << ptr->value << endl; 
     ptr = ptr->next; 
    } 
} 
int main() 
{ 

    int size = 5; 

    int array[size]; 
    for (int i = 0; i < 5; i++) 
    { 
     cout << "Enter value" << endl; 
     cin >> array[i]; 

     insert(head, array[i]); 
    } 

    show(head); 

} 
+2

瞭解傳遞參數之間用* *值和參考差異*。 –

+0

歡迎來到堆棧溢出!這聽起來像你可能需要學習如何使用調試器來遍歷代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。延伸閱讀:** [如何調試小程序(http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** –

+1

看起來像你學習'C'而不是'C++'。那裏有什麼'malloc'(而不是'new')? – PaulMcKenzie

回答

0

請help..Thanks在你insert()功能:

  • head爲NULL,要指定新節點到本地head參數,它沒有更新呼叫者的head變量。這就是爲什麼你的全局變量head總是NULL。這是因爲您是按值傳遞的head參數,所以你要分配新的節點到副本,而不是原來的。您需要通過引用/指針,而不是傳遞參數

  • head不爲NULL時,您沒有正確地遍歷節點來查找尾節點,所以ptr在遍歷後總是爲NULL。根本沒有設置尾節點的next字段。

此外,您的main()泄漏分配的節點。

嘗試一些更喜歡這個:

#include <iostream> 

struct linkedNode 
{ 
    int value; 
    linkedNode *next; 
}; 

void insertValue(linkedNode* &head, int data) 
{ 
    linkedNode *node = new linkedNode; 
    node->value = data; 
    node->next = NULL; 

    if (!head) 
    { 
     head = node; 
    } 
    else 
    { 
     linkedNode *ptr = head; 
     while (ptr->next) 
     { 
      ptr = ptr->next; 
     } 
     ptr->next = node; 
    } 
} 

void showValues(linkedNode *head) 
{ 
    linkedNode *ptr = head; 
    while (ptr) 
    { 
     std::cout << ptr->value << std::endl; 
     ptr = ptr->next; 
    } 
} 

void freeValues(linkedNode* &head) 
{ 
    linkedNode *ptr = head; 
    head = NULL; 

    while (ptr) 
    { 
     linkedNode *next = ptr->next; 
     delete ptr; 
     ptr = next; 
    } 
} 

int main() 
{ 
    linkedNode* mylist = NULL; 

    for (int i = 0; i < 5; ++i) 
    { 
     std::cout << "Enter value" << std::endl; 

     int value; 
     if (std::cin >> value) 
      insertValue(mylist, value); 
    } 

    showValues(mylist); 
    freeValues(mylist); 

    return 0; 
} 

話雖這麼說,如果你一直跟蹤尾節點的列表中,插在年底會更快,效率,因爲你不會需要遍歷列表中的所有:

#include <iostream> 

struct linkedNode 
{ 
    int value; 
    linkedNode *next; 

    linkedNode(int data) 
     value(data), next(NULL) 
    { 
    } 
}; 

struct linkedList 
{ 
    linkedNode *head; 
    linkedNode *tail; 

    linkedList() 
     : head(NULL), tail(NULL) 
    { 
    } 

    ~linkedList() 
    { 
     linkedNode *ptr = head; 
     while (ptr) 
     { 
      linkedNode *next = ptr->next; 
      delete ptr; 
      ptr = next; 
     } 
    } 

    void insert(int data) 
    { 
     linkedNode *node = new linkedNode(data); 

     if (!head) 
      head = node; 

     if (tail) 
      tail->next = node; 
     tail = node; 
    } 

    void showValues() 
    { 
     linkedNode *ptr = head; 
     while (ptr) 
     { 
      std::cout << ptr->value << std::endl; 
      ptr = ptr->next; 
     } 
    } 
}; 

int main() 
{ 
    linkedList mylist; 

    for (int i = 0; i < 5; ++i) 
    { 
     std::cout << "Enter value" << std::endl; 

     int value; 
     if (std::cin >> value) 
      mylist.insert(value); 
    } 

    mylist.showValues(); 

    return 0; 
} 

在這種情況下,你可以只丟了這一切,距離使用標準std::list類,而不是:

#include <iostream> 
#include <list> 
#include <algorithm> 

void showValue(int value) 
{ 
    std::cout << value << std::endl; 
} 

void showValues(const std::list<int> &values) 
{ 
    std::for_each(values.begin(), values.end(), showValue); 

    /* or, if you are using C++11: 

    std::for_each(values.begin(), values.end(), 
     [](int value){ std::cout << value << std::endl; } 
    ); 
    */ 
} 

int main() 
{ 
    std::list<int> mylist; 

    for (int i = 0; i < 5; ++i) 
    { 
     std::cout << "Enter value" << std::endl; 

     int value; 
     if (std::cin >> value) 
      mylist.push_back(value); 
    } 

    showValues(mylist); 

    return 0; 
}