2010-12-13 7 views
7

हमारे प्रोफेसर को यह जांचने की आवश्यकता है कि कोई शब्द स्टैक्स का उपयोग करके पैलिंड्रोम है या नहीं। हर बार जब मैं इसे चलाता हूं, तो एक त्रुटि होती है: Unhandled Exception. Access violation मैं गलत क्या कर रहा हूं? मैं अपना कोड कैसे सुधार सकता हूं?पालिंड्रोम एक स्टैक का उपयोग

typedef struct stack{ 
    char name; 
    struct stack * next; 
}Stack; 

void push(Stack**head, char value); 
char pop(Stack**head); 


int main(){ 
    char word[11]; 
    int i=0; 
    int lenght = 0; 
    Stack*head = NULL; 
    printf("Please type the word: "); 
    scanf("%s", word); 
    lenght = strlen(word); 
    while(word[i]!='\0'){ 
     push(&head, word[i]); 
     i++; 
    } 
    i = 0; 
    while(pop(&head)==word[i]){ 
     i++; 
    } 
    if(i==lenght) printf("The word is a palindrome"); 
    else printf("The word is not a palindrome"); 
} 
+0

पहले एक: का उपयोग '' बजाय मूल्य का मान' [i] 'कार्यों के हस्ताक्षर में। – ruslik

उत्तर

7

आपका push समारोह

  • लेना चाहिए और ढेर सिर के पते (यदि आप इसे सही है)
  • चरित्र में धक्का दे दिया जाना चाहिए (: मेरे कोड इस प्रकार है इसे फिक्सिंग की जरूरत है)।

तो विधि हस्ताक्षर हो जाता है:

void push(Stack**head, char value); 

और समारोह के मुख्य भाग में आप के रूप में ढेर के शीर्ष करने के value जोड़ें:

temp->name = value; 

इसके अलावा, आप हमेशा वापसी की जांच करना चाहिए malloc का मूल्य।

आप समारोह pop से पॉपअप मूल्य लौट रहे हैं के बाद से यह वापसी प्रकार void नहीं होना चाहिए, दोनों घोषणा और परिभाषा char के लिए इसे बदल के रूप में:

char pop(Stack**head) 

एक और तार्किक त्रुटि है:

आपके साथ शुरू करने के लिए इनपुट के सभी पात्रों को ढेर में धक्का दें। इसके बाद आप अक्षर पॉपिंग शुरू करते हैं। आपके पॉपिंग के लिए कोई समाप्ति स्थिति नहीं है। जब आपने सभी पात्रों को पॉप किया है (इसलिए आपका स्टैक खाली है) pop पर अगली कॉल एक क्रैश का कारण बन जाएगी क्योंकि आप NULL पॉइंटर (*headNULL होगा) को संदर्भित करेंगे।

इसे ठीक करने के आप केवल पात्रों पॉप आप ऐसा करके धक्का दे दिया गया है:

while(i<lenght && pop(&head)==word[i]){ 

के बाद से && लघु सर्किट है, pop एक बार आप सभी पात्रों पॉपअप किया है कहा जाता है नहीं किया जाएगा।

वैकल्पिक रूप से (और वरीय दृष्टिकोण) एक और समारोह isEmpty जो true/1 लौट जब ढेर खाली है और इस विधि का उपयोग करने से पहले आप pop विधि कॉल बुलाया लिखने के लिए है। ,

void push(Stack**head, int i, char value[i]); 

तो घोषणा में आर्ग 3 एक चरित्र सरणी है जबकि आर्ग:

push(&head, i, word[i]); 

इस समारोह के रूप में घोषित कर दिया और परिभाषित किया गया है:

+0

मेरी दूसरी त्रुटि शून्य मान को अनदेखा नहीं किया जाना चाहिए क्योंकि यह – newbie

+0

@newbie होना चाहिए: मेरा अद्यतन उत्तर देखें। – codaddict

+0

tnx बहुत :) अब यह काम कर रहा है – newbie

1

इस समारोह के रूप में आप इसे बुला रहे हैं है कॉलिंग हिस्से में 3 एक चरित्र है।value के लिए एक चरित्र का उपयोग करने के अपने push() बदलें और बस i छोड़ देते हैं:

void push(Stack**head, char value){ 
    Stack *temp = (Stack*)malloc(sizeof(Stack)); 
    temp->name = value; 
    temp->next = *head; 
    *head = temp; 
} 

अब से कॉल करने की:

push(&head, word[i]); 
+0

मेरी दूसरी त्रुटि शून्य मान को अनदेखा नहीं किया जाना चाहिए क्योंकि यह – newbie

+0

@newbie 'pop()' को शून्य कार्य के रूप में घोषित किया गया है लेकिन 'val' लौटा रहा है। – chrisaycock

+0

प्रोग्राम चलाते समय एक और त्रुटि होती है – newbie

2

मुझे लगता है कि आप बदलना चाहिए 'शून्य पॉप (ढेर ** सिर) {' में

char pop(Stack **head) { 

और भी खाली ढेर से बचाव:

char pop(Stack**head){ 
Stack* temp; 
char val; 
temp = *head; 
if (!temp) return 0; 
val = temp->name; 
*head = (*head)->next; 
free(temp); 
return val; 
} 
2

आप आप अपने कोड में ढेर के अंत अमीर या नहीं की जाँच करनी चाहिए:

while(i < length && pop(&head)==word[i]){ 
     i++; 
    } 
+0

धन्यवाद ... :) – newbie

2

तुम भी "प्रत्यावर्तन" जो किसी भी तरह एक ढेर के निर्माण के समान है, सिर्फ इतना है कि इसके लिए किया जाता है विचार कर सकते हैं अपने विधि स्पष्ट रूप से कॉल करता है।
पालिंड्रोम समस्या रिकर्सन की शक्ति सीखने के लिए शास्त्रीय अभ्यास है :)

1

आपके कोड को while-pop भाग पर समस्या मिली।

अपने convinience के लिए, मैं आप के लिए संशोधित काम कर कोड संलग्न किया है:

typedef struct stack{ 
    char name; 
    struct stack * next; 
}Stack; 

void push(Stack**head, char value); 
char pop(Stack**head); 



int main (int argc, const char * argv[]) { 


    char word[11]; 
    int i=0; 
    int lenght = 0; 
    Stack*head = NULL; 
    printf("Please type the word: "); 
    scanf("%s", word); 
    lenght = strlen(word); 
    while(word[i]!='\0'){ 
     push(&head, word[i]); 
     i++; 
     } 

    //i = 0; 
    //while(pop(&head)==word[i]){ 
    // i++; 
    //} 

    int counter=0; 
    i=0; 
    for (counter=0; counter<lenght; counter++) { 
    if (pop(&head) == word[counter]) 
    { 
     i++; 
    } 
    } 


    if(i==lenght) printf("The word is a palindrome"); 
    else printf("The word is not a palindrome"); 


    return 0; 
} 

void push(Stack**head,char value){ 

    Stack *temp = (Stack*)malloc(sizeof(Stack)); 
    temp->name = value; 
    temp->next = *head; 
    *head = temp; 
} 

char pop(Stack**head){ 

    Stack* temp; 

    char val; 
    temp = *head; 
    val = temp->name; 
    *head = (*head)->next; 

    free(temp); 
    return val; 
} 
संबंधित मुद्दे