0

私はリンクされたリストについてよく理解していません。それが可能かどうかはわかりませんが、それを行う必要があります:)構造体にロードされるリンクされたリストがあり、すべての文字を比較する必要があります構造体で....例の方が良いです:

これはリンクされたリストなしです

構造体

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");

今、私はこのようなことをする必要がありますが、リンクされたリストで

4

3 に答える 3

1

まず、 int strcmp ( const char * str1, const char * str2 ) は、2 つの C 文字列 (char ポインター) を比較します。これは、a.name[i] が char ではなく char ポインターであるべきであることを意味します! これが事実であることを確認してください (つまり、a.name がchar の配列ではなく、c-string 配列の配列であることを確認してください)。

第 2 に、前のケースの場合、コードは文字列 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;
}

または、すべての文字列を相互に比較する場合は、二重ループを使用します。

于 2011-06-29T23:36:57.963 に答える
0

これは、リンクされたリストをトラバースし、隣接する要素の名前を比較するプログラムです。いくつかの名前を自由に変更しましたが、それ以外のデータ構造のコードはあなたのものと同じです。

#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
于 2011-06-29T23:51:47.450 に答える
0

したがって、最初に行う必要があるのは、連結リストの基礎を理解することです。ここで詳細を読むことができます: http://www.codeproject.com/KB/cpp/linked_list.aspx

注: ポインターを理解するまで、リンクされたリストを理解することはできません。http://www.cplusplus.com/doc/tutorial/pointers/

基本的に、連結リストは、互いにリンクしている多数の「ノード」で構成されています。少なくとも各ノードには 2 つのデータがあり、1 つはデータ (この場合は文字) で、もう 1 つはリスト内の次のノードへのポインターです。

構造体の定義は (疑似コードで) 次のようになります。

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

ただし、これを理解するには、ポインターの基礎を理解する必要があります。

于 2011-06-29T23:36:43.490 に答える