【问题标题】:how to display name of a linked list using only the first three words of a person's name as an initial如何仅使用人名的前三个单词作为首字母来显示链接列表的名称
【发布时间】:2021-03-30 04:50:25
【问题描述】:

如何使用首字母在具有相同首字母的链表中搜索人名?我用过strstr,但还是不行。

void searchStudent(char searchName[]){
    curr = head;
    int i = 1;
    
    while(curr->next != NULL && strstr(curr->name, searchName) != 0){ 
        curr = curr->next;
    } 
    if (curr->next == NULL){
        printf("There no students with this initials %s\n", searchName); 
    }
    else{
        curr = head; 
        while(curr->next != NULL){
            if(strstr(curr->name, searchName) == 0){
                printf("Student #%d\n", i); 
                printf("Name    : %s\n", curr->name);
                printf("Student Number      : %s\n", curr->number );
                printf("------------------------------------\n"); 
                i++;  
                curr = curr->next;
            }
        }
    }   
}

该编码的输出始终是“没有学生使用这个缩写%s\n”

【问题讨论】:

  • 请改进您的示例代码以使其独立。这意味着包括一个主树和初始树,其中包含证明问题的最少数据。删除与演示问题无关的代码,例如最后 3 个打印语句。
  • 你把strstrstrcmp搞混了吗?第一个函数在字符串中搜索子字符串并返回指向它的指针,如果找不到子字符串,则返回 null。第二个将字符串分类为小于、等于或大于另一个字符串。当有命中时,strstr 返回非 null,strstr 返回 0。
  • 支持@AllanWind,为了改善你的问题,更具体的建议是: 1.简单解释一下你的链表的数据结构,即curr。 2. 由于这是函数,输出取决于你是如何调用它的,所以你应该发布外部调用者上下文来说明你是如何调用它的。

标签: c linked-list


【解决方案1】:

另一个答案可能是正确的,但我在这里建议将您的 printf 语句和调试代码放在循环本身中,这样您就可以看到发生了什么并且更容易捕捉到错误,而不是有一个相当复杂和不透明的while 循环,你无法真正知道发生了什么(除了它是否“有效”之外)。

例如:

for(curr=head; node!=NULL; curr=curr->next) {
    printf("StrStr output: %s", strstr(curr->name, searchName)); 
    printf("Student #%d\n", i); 
    printf("Name    : %s\n", curr->name);
    printf("Student Number      : %s\n", curr->number );
}

现在您可以查看所有打印的学生,然后查看 strstr 返回的内容。从那以后,修复您的程序应该很容易。 现在,例如,当您插入 print 语句并能够轻松修复您的代码。

【讨论】:

  • 作为其他答案的作者只想说我喜欢这个建议:-)
  • @AllanWind 谢谢!我是 C 的初学者,所以刚开始问/回答一些问题。
  • 建议将语句移动到函数中的增强功能,如果DEBUG定义为#ifdef DEBUG\nprint_node(curr)#endif然后在顶部定义#define DEBUG 1,则在此处调用该函数。我没有更新,所以要么做或评论打印线。在您的循环中将node 更改为curr。您的循环当前遍历所有元素,如果这是您想要的,请稍后重置 curr= 以在循环之后记录该内容或在条件中添加一些内容以在找到元素时中断循环。
【解决方案2】:

strstr() 在找不到匹配项时返回 NULL,not,因此您可能想要更改:

curr = head;
...
while(curr->next != NULL && strstr(curr->name, searchName) != 0){
...
if (curr->next == NULL){
    printf("There no students with this initials %s\n", searchName); 
}

到:

for(curr = head; curr && !strstr(curr->name, searchName); curr = curr->next, i++);
if(!curr) {
   printf("There no students with this initials %s\n", searchName); 
}

这也修复了可能是缺陷的问题,即您的原始代码没有查看最后一个节点。

您的代码依赖于全局变量。建议您重构您的函数以接受 head 变量作为参数。

【讨论】:

  • 这段代码是否可以搜索链表中的多个数据?
  • 它将搜索所有节点,直到找到匹配项。
  • 我刚试过你的代码。数据存在是没有问题的,如果数据不存在就不会打印“There no students with this initials %s\n”我试了调试但是if连if语句都进不去
  • 我建议您使用当前代码更新问题。当循环条件为假时,循环退出。 !(curr & !strstr) == !curr || strstr()。 !curr 是在我们没有找到正是我们在以下 if 条件中检查的值的情况下。你说它在找到你所说的 strstr() 案例的元素时有效。
猜你喜欢
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 2015-07-19
  • 1970-01-01
  • 2023-01-30
相关资源
最近更新 更多