c - C中的链表程序

标签 c linked-list

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

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

最佳答案

乍一看,您的搜索功能只比较一个元素,即列表的头部。

比较一个元素后,您必须转到下一个元素。这可以递归地完成,也可以在一段时间内完成:

递归使用:

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;
}

关于c - C中的链表程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4733984/

相关文章:

java - 在没有明显访问节点的情况下对 LinkedList 进行排序?

java - 停留在如何将项目添加到库存列表java上

c - 为什么 C 程序返回一个 int?

C 中的计数排序 - 错误 : Use of undeclared identifier

c++ - C/C++ : casting away volatile considered harmful?

java - 如何全局获取Android中的鼠标位置

c - 在小型 C 程序中出现段错误

c - 链表插入无限循环

C链表,丢失元素

c - 链表: Insert function points to itself after second insertion