2015-06-14 126 views
0

我有一個列表,但現在我必須鏈接它。
這裏是我的程序(我刪除了函數內的代碼,使我的程序更容易閱讀)。指針的鏈接列表C++

#include <iostream> 

using namespace std; 

struct Student 
{ 
    char ime[16]; 
    char priimek[16]; 
    char vpisna[10]; 
    char ocenaRV[10]; 
    char ocenaDN[10]; 
    char ocenaKV[10]; 
    char ocenaVI[10]; 
    Student *next; 
}; 

void clean(Student* pointer,int x) // Delete random data 
{ 

} 

void dodajanje(int x,Student* s) // Add information about student 
{ 

} 

void brisi(Student* pointer,int x) // Delete information about student 
{ 

} 

int main() 
{ 
    int student,mesto, brisanje, ali = 0; 
    cout << "Number of students?." << endl; 
    cin >> student; 

    Student* s = new Student[student]; 

    clean(s,student); 

    cout << endl; 
    cout << "Add student to i place in array." << endl; 
    cin >> mesto; 
    dodajanje(mesto, s); 

    for(int i=0;i<(student*2);i++) 
    { 
     cout << "add student = 1, delete student = 2, cout information = 3"<<endl; 
     cin>>ali; 
     if (ali == 1) 
     { 
      cout << endl; 
      cout << "Add student to i place in array." << endl; 
      cin >> mesto; 
      dodajanje(mesto, s); 
     } 
     else if (ali == 2) 
     { 
      cout << "delete student on i place ?" << endl; 
      cin >> brisanje; 
      brisi(s,brisanje); 
     } 
     else 
     { 
      break; 
     } 
    } 
    delete[] s; 

    return 0; 
} 

有人能解釋我如何將我的列表,因爲在我來到所有的教程代碼跨越是與此類似:

Node* temp = Node(); 

但是在我的程序我的代碼是:

Student* s = new Student[student]; 

現在我迷路了;

注:我必須創建動態鏈接列表。

回答

1

Node * temp = Node();

這創建了一個單一的Node實例。雖然它應該是這個:

Node* temp = new Node; 

學生* S =新的學生[學生]

這創建了student個數的Student個實例的數組。這會破壞鏈表的目的,因爲您無法有效地從陣列中添加/刪除Student實例。但是,只是爲了爭論,讓我們說你確實需要一個數組。你可以在「鏈接」的Student情況下,這樣在一起:

for (int i = 0; i < (student-1); i++) 
    s[i].next = &s[i+1]; 
s[student-1].next = NULL; 

如果你確實需要一個鏈表,那麼你需要的東西更像這個:

Student *studentList = NULL; 

Student *lastStudent = NULL; 
for (int i = 0; i < student; ++i) 
{ 
    Student* s = new Student; 
    s->next = NULL; 
    if (lastStudent) lastStudent->next = s; 
    if (!studentList) studentList = s; 
    lastStudent = s; 
} 

// use studentList as needed... 

Student *s = studentList; 
while (s) 
{ 
    Student *next = s->next; 
    delete s; 
    s = next; 
} 

固定在此之後,可以考慮使用STL在C++ 11中改爲std::list類,或甚至std::forward_list

這就是說,你還需要重新考慮你的代碼設計。鏈接列表動態增長和縮小,所以向用戶詢問前面的學生人數或預先分配列表中需要清理的垃圾之前沒有意義。改變你的循環永遠運行(或至少直到用戶說停止)。在每次迭代中,詢問用戶該做什麼。如果Add,那麼當時添加新的Student到列表中。如果Delete,要求用戶刪除哪個學生,找到那個Student,取消關聯它,並delete它。如果Display,詢問用戶要顯示哪個學生,找到那個Student,並顯示它。等等。

+0

非常感謝我會盡我所能 – yack

1

鏈接列表是一個基於節點的數據結構。你想要做的是創建一個學生的動態數組而不是鏈表。

如果你真的需要創建一個鏈表,到位下面一行

Student* s = new Student[student]; 

你應該在學生的時間數量在for循環如下創建一個節點,並通過更新student()-> next= next_student (Psuedo code)彼此鏈接

Student* s = new Student; 

最後,您必須在for循環中調用delete s才能釋放內存。