2016-01-24 101 views
1

我的任務是建立一個「代表堆棧」的基本鏈表。所以數據只能按照後進先出的原則進行訪問。我必須在該「堆棧」上應用某些功能。 我的代碼編譯得很好,但執行時,它只是無限打印1個。我不知道這是如何,因爲我真的只使用一個while循環。 有誰知道我的問題是什麼?也許我可以在將來避免這樣的錯誤。感謝您的任何幫助。並提前道歉,我是一個初學者!爲什麼這個基本的C程序會導致無限循環?

#include <stdio.h> 
#include <stdlib.h> 


typedef struct Stack { 
    struct Stack *next; 
    int data; 
} Stack; 

Stack* push(Stack*head, int d) { //add a datapoint to the top of the stack 
    Stack *temp; 
    temp=malloc(sizeof(Stack)); 
    temp->data=d; 
    temp->next=head; 

    return temp; 
} 


Stack* pop(Stack*head) {  //read the top data point, and delete it 
    Stack* newHead=head->next; 
    printf("%i", head->data); 
    free(head); 
    return newHead; 
} 

int peek(Stack*head) { // return the top datapoint, without delete 
    return head->data; 
} 

void isempty(Stack*head) {  
    if (head==NULL) { 
     printf("Stack empty"); 
    } 

    printf("Stack has data"); 
} 

void print(Stack*head) { //print complete Stack 
    Stack* cursor; 
    cursor=head; 

    while (cursor!=NULL) { 
     printf("%i", cursor->data); 
    } 
} 
int main(int argc, const char * argv[]) { 
    Stack* head; 
    head=malloc(sizeof(Stack)); 
    head=NULL; 
    head=push(head, 4); 
    head=push(head, 2); 
    head=push(head, 1); 
    printf("%i", peek(head)); 
    print(head); 
    head=pop(head); 
    print(head); 
    isempty(head); 
    head=pop(head); 
    head=pop(head); 
    isempty(head); 


    return 0; 
} 
+0

'head = malloc(sizeof(Stack)); head = NULL;'這兩個語句實現了什麼? –

+0

移除'head = malloc(sizeof(Stack));'在main行 - 這不是必需的 –

回答

6

你不會在功能上print增加cursor

while (cursor!=NULL) { 
     printf("%i", cursor->data); 
    } 

的代碼也在這裏出現內存泄漏:

head=malloc(sizeof(Stack)); 
head=NULL; 
1

你有功能print一個無限循環。您需要在循環內更新cursor,否則它將永遠循環。這是我會怎麼做:

void print(Stack*head) { //print complete Stack 
    Stack* cursor; 

    for (cursor = head; cursor != NULL; cursor = cursor->next) { 
     printf("%i", cursor->data); 
    } 
} 
2

在此代碼:

while (cursor!=NULL) { 
    printf("%i", cursor->data); 
} 

你是不是改變光標。因此,將其更改爲

for (cursor = head; cursor!=NULL; cursor = cursor->next) { 
    printf("%i", cursor->data); 
} 
1

您的循環在功能上print步驟一個前:

void print(Stack*head) 
{ 
    Stack* cursor = head; 
    while (cursor != NULL) // 
    { 
     printf("%i", cursor->data); 
     cursor = cursor->next; // step one forward 
    } 
} 

而且存在內存泄漏。您可變head分配內存,但你是正確後設置爲NULL

Stack* head; 
// head=malloc(sizeof(Stack)); // delete this 
head=NULL; 
1

while循環有一個問題:

while (cursor!=NULL) { 
    printf("%i", cursor->data); 
    cursor = cursor->next; // you forgot this line 
} 

沒有這一行,光標永遠不會改變。

相關問題