使用c中的链接列表检测anagram

时间:2013-12-27 18:32:23

标签: c linked-list anagram

我正在尝试编写一个代码,如果它们是字谜,则使用链表来检查2个单词。为此,我想它应该从用户收到2个单词并将它们包含的每个字母传递给链表的节点,并比较节点,如果它们有相同的字母,如果是这样,从第二个单词中删除相同的字母。当过程完成时,如果第二个列表为空,那么它们是字谜。即使1个字母不匹配,它应该返回0,但我不知道如何确定这些单词的长度,这是我到目前为止所写的

#include <stdio.h>
#include <stdlib.h>
struct node                 
{
    struct node *prev;
    struct node *next;
    char data;          
};

typedef struct node *NODE,NOD;

NODE last(NODE list)        
{                           
    if(list!=NULL)
    while(list->next!=NULL)
        list=list->next;
    NODE lst;
    lst=list;
    return lst;
}



void insert( char letter, NODE list)         
{
    NODE nod;
    nod=(NODE)malloc(sizeof(NOD));
    nod->next=NULL;
    nod->prev=NULL;
    nod->data=letter;
    if(list==NULL)
    {
        list=nod;
    }
    else
    {
        nod->prev=last(list);
        last(list)->next=nod;
    }
}

3 个答案:

答案 0 :(得分:2)

只需检查每个单词中每个单词的编号是否相同。

int anagrams(const char *a, const char *b) {
    int counts[256] = {0};
    while (*a) counts[*a++]++;
    while (*b) counts[*b++]--;
    for (int i = 0; i < 256; i++) {
        if (counts[i]) return 0;
    }
    return 1;
}

答案 1 :(得分:1)

为什么要使用链接列表来解决这么简单的问题?

O(N)解决方案:

计算每个单词的每个字母的频率,然后比较这两个直方图。如果它们相等,那么可以从另一个词中获得一个词。

如果你想使用基于链表的解决方案,那么这个单词的长度确实是:

  • 每个输入单词的长度(它们必须具有相同的长度) - 可以通过从链表头到尾的单个遍历来计算它。
  • 删除的符号数量

答案 2 :(得分:0)

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct node {
    char data;
    struct node *prev;
    struct node *next;
} NODE;

NODE *newNode(char ch){
    NODE *p = malloc(sizeof(NODE));
    if(p){
        p->data = ch;
        p->prev = p->next = NULL;
    }
    return p;
}

void insert(NODE **list, NODE *node){
    if(*list == NULL){
        *list = node;
        return ;
    }
    NODE *curr = *list;
    while(curr){
        if(curr->data >= node->data){//insert sort
            if(curr->prev == NULL)
                *list = node;
            else
                curr->prev->next = node;
            node->prev = curr->prev;
            curr->prev = node;
            node->next = curr;
            break;
        }
        if(curr->next == NULL){
            curr->next = node;
            node->prev = curr;
            break;
        } else
            curr = curr->next;
    }
}

NODE *input_word(){
    NODE *word=NULL;
    int ch;
    while(EOF!=(ch=getchar()) && ch != '\n'){
        insert(&word, newNode(ch));
    }
    return word;
}

bool isAnagram(NODE *word1, NODE *word2){
    while(word1 && word2){
        if(word1->data != word2-> data)
            return false;
        word1 = word1->next;
        word2 = word2->next;
    }
    return word1 == NULL && word2 == NULL;
}

int main(){
    NODE *word1, *word2;
    printf("input word : ");
    word1 = input_word();
    printf("input other word : ");
    word2 = input_word();
    if(isAnagram(word1, word2))
        printf("YES\n");
    else
        printf("NO\n");
    //drop(word1);drop(word2);
    return 0;
}