2011-01-19 210 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和免费用于添加功能?