2012-03-10 53 views
1

C++問題在這裏。我已經成功(經過一番研究:P)爲一堆整數創建了一個鏈表實現。我在修改char *的時候遇到了一些麻煩......從鏈接列表中檢索字符

我認爲這可能只是一個問題,與我在下面定義的linklistCommands類使用的函數有關的引用/取消引用指針。 (我一直無法理解什麼時候使用&或*與參數和返回值有關。)我已經評論了我的代碼中可能混淆的行。

不管怎麼說,這裏是我的代碼至今:

struct linkc { // one 'link', stores a pointer to a char array 
    char * value; 
    linkc *next; 
}; 

class linklistCommands 
{ 
    public: 
    linklistCommands() 
     {top = NULL;} 
    ~linklistCommands() 
     {} 
    void push(char * address) // Pretty sure I'm OK here. 
     { 
     linkc *temp = new linkc; 
     temp->value = address; 
     temp->next = top; 
     top = temp; 
     } 
    char* pop() // Pretty sure I have to change something on this line 
     { 
     if (top == NULL) 
     return 0; 
     linkc * temp; 
     temp = top; 
     char * value; 
     value = temp->value; 
     top = temp->next; 
     delete temp; 
     return value; 
     } 
    bool isEmpty() 
     { 
     if (top == NULL) 
     return 1; 
     return 0; 
     } 
    private: 
    linkc *top; 
}; 

int main(void) 
{ 

// pushed strings are of an arbitrary, but always known, length 
char[4] stringA = "foo"; 
char[6] stringB = "fooba"; 
char[8] stringC = "foobar "; 

linklistCommands commandList; 

commandList.push(stringA);  
commandList.push(stringB); 
commandList.push(stringC); 

while(commandList.isEmpty!=1) 
{ 
    cout << (*commandList.pop()) << endl; 
} 
} 

感謝您在我的問題和/或任何澄清您可以提供:)

回答

1

類似乎確定的類型,但要改變的主要需求:

// pushed strings are of an arbitrary, but always known, length 
char stringA[] = "foo"; 
char stringB[] = "fooba"; 
char stringC[] = "foobar "; 

linklistCommands commandList; 

commandList.push(stringA); 
commandList.push(stringB); 
commandList.push(stringC); 

while(commandList.isEmpty()!=1) 
{ 
    cout << commandList.pop() << endl; 
} 

你應該考慮使用的std :: string而不是char *,它更簡單,更安全。 另外,char [N] stringA =「...」;它是C#或Java語法,而不是C++

+0

請注意,如果你的stringA,stringB等超出範圍(它們不會在主體中,但它們可能會在另一個函數中聲明),它們將在任何地方停止存在(以及它們可能會也可能不會,這取決於你的程序正在做的基本上不相關的其他事情),並且如果它們稍後彈出,你的堆棧將返回垃圾。使用std :: string會阻止這一點。 – Brilliand 2012-03-10 08:04:55

+0

啊。 StringA,stringB不是我實際代碼的一部分,而只是在那裏放置。至於我的實際變量,我正在管理那些從未被超出範圍的內存。 – zedadex 2012-03-10 10:35:56

+0

chac,我可以/不應該在C++中使用char [N]嗎?我在那裏輸入char [N]只是爲了表明字符串長度可以變化,但長度是已知的,但我的實際代碼沒有將字符串初始化爲它們的最終值 - 它們相當於在時間,從一個循環。 – zedadex 2012-03-10 10:38:06

0

讀你必須分配和管理的char *數據字段並複製輸入值。 :)(或至少使用strdup())。你可能也想看看爲const char *作爲輸入數據

0

我正在從我的單元發送,所以簡短回答:&用於獲取當前元素的地址,*用於從地址獲取值。所以通過使用兩次,你可以從一個地址獲得值,指向一個值的地址。

+0

是的,我通常可以很好地理解,但是我覺得當操作符用於定義函數返回值或在函數參數中。 – zedadex 2012-03-10 08:15:37

+0

不是,但我想你需要看看它是如何編譯來理解爲什麼這樣。無論如何,一顆星星的意思是,你返回一個地址的值和兩個開始的意思是,你有一個地址值的地址。編譯器需要知道的是你的值的內存佈局(類型)以及跟蹤地址的頻率。 – pgampe 2012-03-13 08:25:59