Anonymous
Anonymous asked in 電腦與網際網路程式設計 · 1 decade ago

c++鏈結link、串列等問題疑惑、還有釋放記億體

以下是一個書本code

以head開始,輸入n並增加n點在tail後,輸出串列內容

#include <conio.h>

#include <string>

#include <iostream>

using namespace std;

struct node

{

int data;

node *next;

};

typedef node *list; //我不懂這個地方,typedef的功能到底是???

//加了此行主要的用途??

int main()

{

list head ,tail,link;

int n;

cout <<"要增加幾點";

cin >>n;

link=new node; //這配置了new node動態記億體??讓link指向是吧

head =tail=link; //將head 跟 tail也指向此node

head->data=0; //node的資料為0

for(int i=1;i<=n;i++)

{

link=new node; //此刻再配置一個new node

link->data=i;

link->next=NULL;//這句意思是他還沒有抓下一個位置嗎??

//畢竟下一個位置還沒被分配到記億體

//所以先指向空白?????

tail->next=link; //最不明白的地方....

//如果只是tail->next 那會同於 link->nextㄇ

//還是分道揚鑣了,為什麼後面要等於link

tail=link; //我要請教這一行跟上一行

}

link=head;

while(link)

{

cout<<link->data<<" ";

link=link->next;

}

while(link) //有關釋放記億體,我看了兩本書

{ //倒底是如這裡的,從第一個頭開始

head=head->next; //釋放,還是從尾巴開始釋放正確??

delete link;

link=head;

}

getch();

}

還有我在另一本書發現

有關typedef

他是先被宣告出來的,如下

typedef struct node

{

int data;

int link;

}node;

node arrt[N];

這樣跟上面那程式是一樣嗎,還是有其它的差異??

因為不懂所以想問>< 謝謝指教!!

3 Answers

Rating
  • Cloud
    Lv 4
    1 decade ago
    Favorite Answer

    typedef node *list; //我不懂這個地方,typedef的功能到底是???

    //加了此行主要的用途??

    typedef關鍵字是用來自訂資料型態的

    這一行主要是定義 list 型態為 "node *",也就是node指標

    link=new node; //這配置了new node動態記億體??讓link指向是吧

    link是list型態,也就是node *型態

    所以用new node來配置一個node結構的記憶體空間

    並把配置到的記憶體空間位址存到 " link "

    head =tail=link; //將head 跟 tail也指向此node

    因為 link 是指到第一個node空間位址,

    所以把指向串列頭以及串列尾的指標也只像它

    head->data=0; //node的資料為0

    是的

    link=new node; //此刻再配置一個new node

    不是new node,new是關鍵字

    是配置node大小的空間,並把位址存到link變數

    link->next=NULL;//這句意思是他還沒有抓下一個位置嗎??

    //畢竟下一個位置還沒被分配到記億體

    //所以先指向空白?????

    最主要的原因是要做初始化的動作

    所以才把只到下一個位址的指標指到NULL(空指標)

    tail->next=link; //最不明白的地方....

    //如果只是tail->next 那會同於 link->nextㄇ

    //還是分道揚鑣了,為什麼後面要等於link

    tail=link; //我要請教這一行跟上一行

    注意看程式link已經被配置新的node空間了

    所以head跟tail指到同一個位址

    但是link指到新配置的空間

    所以只不過把tail的下一個位址指到剛配置的空間去

    接下來把目前的link變成 tail 指標所指的空間

    下一個迴圈開始執行時,head指標的位址就不等於tail指標的位址

    while(link) //有關釋放記億體,我看了兩本書

    { //倒底是如這裡的,從第一個頭開始

    head=head->next; //釋放,還是從尾巴開始釋放正確??

    delete link;

    link=head;

    }

    此段有寫錯

    要在前面先加

    link=head;

    link是目前指標

    當目前指標有指到位址時

    就持續執行while迴圈

    將head指到目前head的下一個位址

    釋放目前的link空間

    然後把新的head值存到link指標去

    以目前您程式的結構是要從頭釋放

    除非是雙向串列才可以從尾是放空間

    最後問的typedef

    兩個得出的結果有些微不同

    前面的可能在純C的環境會編譯不過

    前者是定義node *成list

    後者是定義struct node結構成 node

    純C的環境在宣告結構時需要加struct

    struct node myNode;

    Source(s): 自己
  • Anonymous
    6 years ago

    到下面的網址看看吧

    ▶▶http://*****

  • 6 years ago

    到下面的網址看看吧

    ▶▶http://*****

Still have questions? Get your answers by asking now.