2011-01-19 83 views
1

我編寫了一個簡單的鏈表,但面臨一個小問題。該程序就像通過用戶接受名稱,年齡和DOB,併爲其動態分配內存。從用戶處獲取數據後,它正在搜索一個名稱,並由用戶詢問該名稱是否存在,應打印出與其相關的所有詳細信息。 這裏是我的代碼 -C中的鏈接列表程序

//function declarations 
struct node *initnode(char *, char *, char *); 

void add(struct node *); 

struct node *printnode(struct node *); 

struct node *searchname(struct node *, char *); 

struct node { 
    char name[25]; 
    char age[10]; 
    char dob[10]; 
    struct node *next; 
}; 

struct node *head = (struct node *) NULL; 

struct node *initnode(char *name, char *age, char *dob1) 
{ 
    struct node *ptr; 
    ptr = (struct node *) malloc(sizeof(struct node)); 
    if (ptr == NULL) 
     return (struct node *) NULL; 
    else { 
     strcpy(ptr->name, name); 
     strcpy(ptr->age, age); 
     strcpy(ptr->dob, dob1); 
     ptr->next = NULL; 
     return ptr; 
    } 

} 

struct node *printnode(struct node *ptr) 
{ 
    printf("Name -> %s\n", ptr->name); 
    printf("age -> %s \n", ptr->age); 
    printf("dob ->%s\n", ptr->dob); 
    return ptr; 
} 

void add(struct node *newp) 
{ 
    struct node *temp = (struct node *) malloc(sizeof(struct node)); 
    if (head == NULL) 
     head = newp; 
    else { 
     for (temp = head; temp->next != NULL; temp = temp->next); 
     temp->next = newp; 
     temp = newp; 
    } 
    free(temp); 
} 

struct node *searchname(struct node *ptr, char *name1) 
{ 

    if (strcmp(name1, ptr->name) == 0) { 
     printf("\n name found \n"); 
     printf("\n details are -\n"); 
     printnode(ptr); 
     return ptr; 
    } else { 
     printf("\n name not found in the database \n"); 
    } 

} 

int main() 
{ 
    char name[25]; 
    char name1[25]; 
    char rep; 
    char age[10]; 
    char dob[10]; 
    int i; 
    int flag = 1; 
    struct node *ptr; 

    do { 
     fflush(stdin); 
     while (flag != 0) { 
      printf("Enter name -- "); 
      gets(name); 

      for (i = 0; name[i] != '\0'; i++) 
       if (isdigit(name[i])) { 
        printf("Error in user input, name should be in alphabets\n"); 
        flag = 1; 
        break; 
       } 

       else 
        flag = 0; 
     } 

     flag = 1; 

     while (flag != 0) { 
      printf("Enter age -- "); 
      scanf("%s", &age); 
      fflush(stdin); 

      for (i = 0; age[i] != '\0'; i++) 
       if (isalpha(age[i])) { 

        printf("Error in user input, age should be in numbers\n"); 
        flag = 1; 
        break; 
       } else { 
        flag = 0; 
       } 
     } 

     flag = 1; 
     while (flag != 0) { 
      printf("Enter dob in DD/MM/YY format-- "); 
      scanf("%s", &dob); 
      fflush(stdin); 

      for (i = 0; dob[i] != '\0'; i++) { 
       if (isalpha(dob[i])) { 
        printf("Error in user input, dob should be in numbers\n"); 
        flag = 1; 
        break; 
       } else 
        flag = 0; 

      } 

     } 

     flag = 1; 

     ptr = initnode(name, age, dob); 
     add(ptr); 

     printf("\n Do you want to continue?<Y/N>:\n "); 
     scanf("%s", &rep); 
     //rep = getchar(); 

    } 
    while (rep == 'Y' || rep == 'y'); 

    printf("\n do u want to search for a name in the database? <Y/N>:\n"); 
    scanf("%s", &rep); 

    if (rep == 'Y' || rep == 'y') { 
     printf("Enter name you want to search-- "); 
     scanf("%s", &name1); 

     ptr = searchname(head, name1); 
    } else { 
     printf("\n goodbye \n"); 
    } 

    do { 
     printf("\n do u want to search again? <Y/N>:\n"); 
     scanf("%s", &rep); 

     if (rep == 'Y' || rep == 'y') { 

      printf("Enter name you want to search-- "); 
      scanf("%s", &name1); 

      ptr = searchname(head, name1); 
     } else { 
      printf("\n goodbye \n"); 
     } 
    } 
    while (rep == 'Y' || rep == 'y'); 
    return 0; 

} 

的問題是,它是搜索的第一個條目,而不是其他人,誰能幫助我理清這一點?我正在通過「gcc」進行編譯。

+1

不要調用`fflush`上`stdin` - 這導致未定義** Behavio(u)r ** - 查看`fflush`的手冊頁 - 它只能用於輸出流。 – 2011-01-19 10:15:01

+2

請重新格式化代碼。 – Rozuur 2011-01-19 10:15:13

+0

這是功課嗎?如果是,那麼你應該這樣標記它。 – 2011-01-19 10:44:29

回答

1

乍一看,你的搜索功能只是比較一個元素,即列表頭。

比較一個元素後,你必須去下一個元素。這既可以完成遞歸或一段時間:

遞歸使用:

struct node *searchname(struct node *ptr, char *name1) 
{ 
if (ptr==NULL) //Reached end of the list 
{ 
    printf("\n name not found in the database \n"); 
    return NULL; 
} 
    if (strcmp(name1, ptr->name) == 0) { //found the element 
     printf("\n name found \n"); 
     printf("\n details are -\n"); 
     printnode(ptr); 
     return ptr; 
    } else { //search next element 
     return searchname(ptr->next,name1); //this will call your function again for the next element on the list 
    } 
} 

雖然使用:

struct node *searchname(struct node *ptr, char *name1) 
{ 
struct node *aux; // usually i use an auxiliary pointer in order to avoid unwanted overwrite at my pointer. 
aux = ptr; 
while (aux!=NULL) 
{ 
    if (strcmp(name1, aux->name) == 0) { //found the element 
     printf("\n name found \n"); 
     printf("\n details are -\n"); 
     printnode(aux); 
     return aux; 
    } 
    else { //move pointer to next element 
    aux=aux->next; 
    } 
} 
//if it reaches this point, the element was not found 
printf("\n name not found in the database \n"); 
return NULL; 
} 
1

檢查你的add函數,這是錯誤的。通過它精神上的步驟,並看看你的指針,並指向它指向的內存 會發生什麼。

什麼是malloc和免費用於添加功能?