2017-07-12 4 views
-1
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
#include <ctype.h> 

struct Stud 
{ 
    char name[20]; 
    struct Stud *next; 
}; 

struct Stud *hptr=NULL,*tptr; 
//char data[20]; 


void deleteKey(struct Stud *hptr,char data[20]) 
{ 
    struct Stud * temp = hptr, *prev; 
    while (temp != NULL && temp->name == data) 
    { 
     hptr = temp->next; 
     free(temp); 
     temp = hptr; 
    } 
    while (temp != NULL) 
    { 
     while (temp != NULL && temp->name != data) 
     { 
      prev = temp; 
      temp = temp->next; 
     } 


     if (temp == NULL) return; 


     prev->next = temp->next; 

     free(temp); 


     temp = prev->next; 
    } 
} 




void createList(char *s) 
{ 
    struct Stud *nptr; 
    nptr=(struct Stud *)malloc(sizeof(struct Stud)); 
    strcpy(nptr->name,s); 
    if(hptr==NULL) 
    hptr=tptr=nptr; 
    else 
     tptr->next=nptr; 
    tptr=nptr; 
    nptr->next=NULL; 
} 


void display(){ 
    while(hptr!=NULL) { 
     printf("%s ",hptr->name); 
     hptr=hptr->next; 
    } 


} 


void main(){ 
    int i,n; 
    char str1[20]; 
    char s[20]; 
    scanf("%d",&n); 
    for(i = 0; i < n; i++) { 
     scanf("%s",str1); 
     createList(str1); 
    } 
    scanf("%s",s); 
    display(); 
    deleteKey(hptr, s); 
    display(); 
} 

deleteKeyに引数を渡す際に希望のoutput.pleaseが正しく表示されません。 。 例えば: 入力: kmit jntu snist CBIT ngit CBIT 出力:それので、参照により関数にヘッドノードを通過する必要が kmit jntu snist ngitc指定されたリンクリストから要素を削除して、リスト全体を印刷します。

+0

のですか?また、指定された入力に対して、実際の出力と期待される出力も含めます。 –

+2

開始: '... && temp-> name == data'の場合、文字配列とこのような文字列を比較することはできません。 – wildplasser

+2

'strcmp'を使用して文字配列を比較します。 [strcmp](http://www.cplusplus.com/reference/cstring/strcmp/) – woz

答えて

0

関数内で変更することができます。

また、標準機能strcmpを使用して文字列を比較する必要があります。この式

temp->name == data 

そこに

は、2つの配列の最初の文字のアドレスを比較し、それらが等しくないことは明らかです。

ここでは、その機能の実装方法を示すデモンストレーションプログラムです。

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

struct Stud 
{ 
    char name[20]; 
    struct Stud *next; 
}; 

int deleteKey(struct Stud **head, const char *name) 
{ 
    while (*head && strcmp((*head)->name, name) != 0) 
    { 
     head = &(*head)->next; 
    } 

    int success = *head != NULL; 

    if (success) 
    { 
     struct Stud *node = *head; 
     *head = (*head)->next; 
     free(node); 
    } 

    return success; 
} 

int push_front(struct Stud **head, const char *name) 
{ 
    struct Stud *node = malloc(sizeof(*node)); 
    int success = node != NULL; 

    if (success) 
    { 
     strncpy(node->name, name, sizeof(node->name)); 
     node->name[sizeof(node->name) - 1] = '\0'; 
     node->next = *head; 
     *head = node; 
    } 

    return success; 
} 

void display_list(struct Stud **head) 
{ 
    for (struct Stud *current = *head; current != NULL; current = current->next) 
    { 
     printf("%s ", current->name); 
    } 
} 

int main(void) 
{ 
    struct Stud *head = NULL; 

    push_front(&head, "Bob"); 
    push_front(&head, "Peter"); 
    push_front(&head, "Margarite"); 

    display_list(&head); 
    putchar('\n'); 

    deleteKey(&head, "Margarite"); 

    display_list(&head); 
    putchar('\n'); 

    deleteKey(&head, "Bob"); 

    display_list(&head); 
    putchar('\n'); 

    deleteKey(&head, "Peter"); 

    display_list(&head); 
    putchar('\n'); 

    return 0; 
} 

プログラムの出力は、(http://stackoverflow.com/help/mcve)[、最小完全、かつ検証例]を含むようにあなたの質問を編集してくださいすることができ

Margarite Peter Bob 
Peter Bob 
Peter 
関連する問題