【问题标题】:Linked list program in CC中的链表程序
【发布时间】:2011-01-19 10:10:19
【问题描述】:

我正在编写一个简单的链表,但遇到了一个小问题。该程序就像它通过用户接受名称,年龄和DOB,并且它的内存是动态分配的。从用户那里获取数据后,它正在搜索一个名称,用户询问,如果该名称存在,它应该打印与其相关的所有详细信息。 这是我的代码-

//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”进行编译。

【问题讨论】:

  • 永远不要在 stdin 上调用 fflush - 这会导致 Undefined Behavio(u)r - 请参阅 fflush 的手册页 - 它只能用于输出流。
  • 这是作业吗?如果是,那么你应该这样标记它。
  • 你的作业??我有一个查询,这就是我的要求..

标签: c linked-list


【解决方案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;
}

【讨论】:

  • 如果我也在使用您的功能,那么它也只会搜索名字。为第一个以外的条目提供错误-“找不到名称”..
  • 嘿,谢谢,代码现在可以正常工作了.. 它现在正在搜索所有名称.. :)
【解决方案2】:

检查你的 add 函数,它是错误的。精神上通过它,看看会发生什么 指向您的指针,以及它指向的内存。

add函数中的malloc和free是干什么用的?

【讨论】:

  • @kamakshi:如果你不能发挥你的想象力,那么你可以在这里拿出你最喜欢的调试器并逐步执行程序。
  • malloc 用于为临时指针分配内存,是不是不正确?如果我错了,请指导我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多