Сравните использование strcmp в связанном списке

Я не очень разбираюсь в связном списке, я не знаю, возможно ли это, но мне нужно это сделать :) У меня есть связанный список, который загружается в структуру, и мне нужно сравнить все символы на структуру.... Лучше с примером:

Это без связанных списков

структура

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

Теперь мне нужно сделать что-то подобное, но со связанным списком


person P3druh77    schedule 29.06.2011    source источник
comment
Сложно вам помочь, не зная интерфейса/структуры вашего связанного списка.   -  person GWW    schedule 30.06.2011


Ответы (3)


Прежде всего: 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;
}

или с двойным циклом, если вы хотите сравнить все строки друг с другом.

person codd    schedule 29.06.2011

Итак, первое, что вам нужно сделать, это понять основы связного списка. Подробнее можно прочитать здесь: 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;
}

Но опять же, чтобы понять это, вам нужно понять основы указателей.

person Ayush Sood    schedule 29.06.2011
comment
Как сказал GWW, структура вашего связанного списка может варьироваться. Я сделал это для очень простого односвязного связанного списка. Существуют и другие, такие как двусвязные связанные списки и круговые списки. Все зависит от вашей потребности. - person Ayush Sood; 30.06.2011

Вот программа, которая просматривает связанный список и сравнивает имена соседних элементов. Я взял на себя смелость переименовать пару вещей, но в остальном код для структур данных такой же, как у вас.

#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
person antonakos    schedule 29.06.2011