【问题标题】:Compare using strcmp on linked-list在链表上使用 strcmp 进行比较
【发布时间】:2011-06-29 23:18:02
【问题描述】:

我对链表不是很了解,我不知道这是否可能,但我需要这样做:) 我有一个加载到结构中的链表,我需要比较一个结构上的所有字符......最好举个例子:

这是没有链表的

结构

typedef struct x{
char name[100];
}x;

typedef x Info;

typdef struct Elem{
Info node;
struct Elem*next;
}Element;


  for(i=0;i<100;i++){
  if(strcmp(a.name[i],a.name[i+1])==0){
  printf("Same name\n");
  }
  }
  else
  printf("Diff name\n");

现在我需要用链表做类似的事情

【问题讨论】:

  • 不知道你的链表的接口/结构很难帮你。

标签: c linked-list strcmp


【解决方案1】:

首先: int strcmp ( const char * str1, const char * str2 ) 比较两个 C 字符串(char 指针)。这意味着 a.name[i] 应该是 char 指针而不是 char!确保是这种情况(即确保 a.name 是 c 字符串数组的数组,并且 不是 字符数组)。

其次,如果是前面的情况,您的代码只会将字符串 i 与字符串 i+1 进行比较。它不会将所有字符串相互比较。

在任何情况下,您似乎都没有以正确的方式做任何您想做的事情。我猜你想要一个这样定义的结构:

struct example {
    char * name;
    // other members of choice
    example * next;
}

名称、其他成员和下一个指针的占位符以启用链表数据类型。这样您就可以将名称与:

while (list->next != 0 && list->next->next != 0) {
    if (strcmp(list->name, list->next->name) == 0) // do something;
    else // do something else;
}

如果你想比较所有字符串,或者使用双循环。

【讨论】:

    【解决方案2】:

    因此,您需要做的第一件事是了解链表的基础知识。你可以在这里详细阅读:http://www.codeproject.com/KB/cpp/linked_list.aspx

    注意:在你理解指针之前,你真的无法理解链表。 http://www.cplusplus.com/doc/tutorial/pointers/

    本质上,链表由许多相互链接的“节点”组成。每个节点至少有两条数据,一条是数据(在您的情况下是一个字符),另一条是指向列表中下一个节点的指针。

    定义一个结构看起来像(在伪代码中):

    LinkedList nodeT {
        char *c; //NOTE: strcmp only compares pointers to chars
        nodeT *nextNode;
    }
    

    你会有一个指向链表第一个节点的指针。比如:

    nodeT *firstElement;
    

    然后循环浏览整个列表就是小菜一碟:

    nodeT *curElement = firstElement;
    while(curElement->next != NULL) { //assuming the last node's next pointer is NULL
        if(strcmp(curElement->c,curElement->next->c)==0){
            printf("Same name\n");
        } else {
             printf("Diff name\n");
        }
        curElement = curElement->nextNode;
    }
    

    但同样,要理解这一点,您需要了解指针的基础知识。

    【讨论】:

    • 正如 GWW 所说,您的链表的结构可能会有所不同。我这样做是为了一个非常简单的单链接链表。还有其他的,例如双向链表和循环链表。这完全取决于您的需要。
    【解决方案3】:

    这是一个遍历链表并比较相邻元素名称的程序。我冒昧地重命名了一些东西,但数据结构的代码与你的相同。

    #include <string.h>
    #include <stdio.h>
    #include <assert.h>
    
    typedef struct Info_ {
        char name[100];
    } Info;
    
    typedef struct Element_ {
        Info info;
        struct Element_* next;
    } Element;
    
    void print_comparisons(Element* elm)
    {
        assert(elm);
    
        Element* cur = elm;
        Element* next = cur->next;
        for (; next; cur = next, next = next->next) {
            if (strcmp(cur->info.name, next->info.name) == 0)
                printf("Same name\n");
            else
                printf("Diff name\n");
        }
    }
    
    int main()
    {
        Info a; a.name[0] = 'A'; a.name[1] = '\0';
        Info b; b.name[0] = 'B'; b.name[1] = '\0';
        Info c; c.name[0] = 'B'; c.name[1] = '\0';
        Info d; d.name[0] = 'D'; d.name[1] = '\0';
        Element na; na.info = a;
        Element nb; nb.info = b;
        Element nc; nc.info = c;
        Element nd; nd.info = d;
    
        na.next = &nb;
        nb.next = &nc;
        nc.next = &nd;
        nd.next = NULL;
    
        print_comparisons(&na);
    }
    

    程序的输出:

    Diff name
    Same name
    Diff name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多