Вывести те элементы списка которые повторяются один раз - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Нужно вывести те элементы двусвязного списка которые повторяются один раз
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct list
{
char word[100];
struct list *next;
struct list *prev;
}list;
void creat_list(list **head, list **tail)
{
list *temp = (list*)malloc(sizeof(list));
printf ("Enter el list:\n");
scanf("%s", temp->word);
temp->next = NULL;
temp->prev = NULL;
}
list * add_to_list(list *tail)
{
list *temp;
int f = 1;
while(f)
        {
        temp = (list*)malloc(sizeof(list));
        printf ("Enter el list:\n");
        scanf ("%s", temp->word);
        temp->next = NULL;
        temp->prev = tail;
        temp->next = temp;
        tail = temp;
        printf ("Enter new el list - 1\n End - 0\n");
        scanf ("%d", &f);
        }
        return tail;
}
void show_el(list *temp)
{
printf ("%s", temp->word);
}
void search(list *l1_tail, list *l1_head)
{
int f ,i,j,n;
list *prev = l1_tail;
list *next = l1_head;
scanf ("%d", &n);
while (next != NULL)
{
{
for(i = 0;i < n; i++)
{
f = 1;
for (j = 0; j < n;j++)
{
if(!strcmp(prev->word,next->word))
f = 0;
break;
}
 if (f == 1) printf("%s ", prev->word);
}
 }
 }
 }
#pragma argsused
int main(int argc, char* argv[])
{
list *l1_head, *l1_tail;
 
 int f;
 setlocale (LC_ALL, "");
 
 printf ("Created new list\n");
 creat_list(l1_head, l1_tail);
 printf ("Enter new el list-1\n End - 0\n");
 scanf ("%d", &f);
 if(f)
 l1_tail = add_to_list(l1_tail);
 search (l1_tail, l1_head);
 getche();
        return 0;
}
Проблема в том что я не знаю как написать функцию для того чтобы выводило только уникальные слова
void search(list *l1_tail, list *l1_head)
{
int f ,i,j,n;
list *prev = l1_tail;
list *next = l1_head;
scanf ("%d", &n);
while (next != NULL)
{
{
for(i = 0;i < n; i++)
{
f = 1;
for (j = 0; j < n;j++)
{
if(!strcmp(prev->word,next->word))
f = 0;
break;
}
 if (f == 1) printf("%s ", prev->word);
}
 }
 }
 }
Проблема где то здесь... Бьюсь над этим уже около недели, так что ваша помощь действительно последний шанс. Заранее спасибо.
Решил зайти с другой стороны и попробовать сделать сначала с числами. И неожиданно для меня получилось.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
struct node
{
    int num;
    struct node *next;
};

void dup_delete(struct node **head)
{
    struct node *p, *q, *prev, *temp;
 
    p = q = prev = *head;
    q = q->next;
    while (p != NULL)
    {
        while (q != NULL && q->num != p->num)
        {
            prev = q;
            q = q->next;
        }
        if (q == NULL)
        {
            p = p->next;
            if (p != NULL)
            {
                q = p->next;
            }
        }
        else if (q->num == p->num)
        {
            prev->next = q->next;
            temp = q;
            q = q->next;
            free(temp);
        }
    }
}
 
void create(struct node **head)
{
    int c, ch;
    struct node *temp, *rear;
 
    do
    {
        printf("Enter number: ");
        scanf("%d", &c);
        temp = (struct node *)malloc(sizeof(struct node));
        temp->num = c;
        temp->next = NULL;
        if (*head == NULL)
        {
            *head = temp;
        }
        else
        {
            rear->next = temp;
        }
        rear = temp;
        printf("Do you wish to continue [1/0]: ");
        scanf("%d", &ch);
    } while (ch != 0);
    printf("\n");
}
 
void display(struct node *p)
{
    while (p != NULL)
    {
        printf("%d\t", p->num);
        p = p->next;
    }
    printf("\n");
}
 
void release(struct node **head)
{
    struct node *temp = *head;
    *head = (*head)->next;
    while ((*head) != NULL)
    {
        free(temp);
        temp = *head;
        (*head) = (*head)->next;
    }
}

int main()
{
    struct node *p = NULL;
    struct node_occur *head = NULL;
    int n;
 
    printf("Enter data into the list\n");
    create(&p);
    printf("Displaying the nodes in the list:\n");
    display(p);
    printf("Deleting duplicate elements in the list...\n");
    dup_delete(&p);
    printf("Displaying non-deleted nodes in the list:\n");
    display(p);
    release(&p);
    getch();
    return 0;
}
Счастью моему не было предела и я тут же решил повторить тоже с символами и в итоге... Не получилось.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
struct node
{
    char word[100];
    struct node *next;
};
 
void dup_delete(struct node **head)
{
    struct node *p, *q, *prev, *temp;
    p = q = prev = *head;
    q = q->next;
    while (p != NULL)
    {
        while (q != NULL )
        {
            prev = q;
            q = q->next;
        }
        if (q == NULL)
        {
            p = p->next;
            if (p != NULL)
            {
                q = p->next;
            }
        }
        else if (strcmp(q->word,p->word))
        {
            prev->next = q->next;
            temp = q;
            q = q->next;
            free(temp);
        }
    }
}
 
void create(struct node **head)
{
    char c[100];
    int ch;
    struct node *temp, *rear;
 
    do
    {
        printf("Enter word: ");
        scanf("%s", &c);
        temp = (struct node *)malloc(sizeof(struct node));
        temp->word == c;
        temp->next = NULL;
        if (*head == NULL)
        {
            *head = temp;
        }
        else
        {
            rear->next = temp;
        }
        rear = temp;
        printf("Do you wish to continue [1/0]: ");
        scanf("%d", &ch);
    } while (ch != 0);
    printf("\n");
}
 
void display(struct node *p)
{
    while (p != NULL)
    {
        printf("%s  ", p->word);
        p = p->next;
    }
    printf("\n");
}
 
void release(struct node **head)
{
    struct node *temp = *head;
    *head = (*head)->next;
    while ((*head) != NULL)
    {
        free(temp);
        temp = *head;
        (*head) = (*head)->next;
    }
}

int main()
{
    struct node *p = NULL;
    struct node_occur *head = NULL;
    printf("Enter data into the list\n");
    create(&p);
    printf("Displaying the nodes in the list:\n");
    display(p);
    printf("Deleting duplicate elements in the list...\n");
    dup_delete(p);
    printf("Displaying non-deleted nodes in the list:\n");
    display(p);
    release(p);
    getch ();
    return 0;
}
О гуру программирования, какую же сверхидиотскую ошибку я совершил?Заранее спасибо

Решение задачи: «Вывести те элементы списка которые повторяются один раз»

textual
Листинг программы
#include <glib.h>
 
#define DELIM " \t\n"
 
int main(void) {
    gchar * line;
    GError * err = NULL;
    GIOChannel * inp = g_io_channel_unix_new(0);
    
    if ( ! inp )
        g_error("Can't create input channel!\n");
    
    while ( g_print("Enter some words: "), g_io_channel_read_line(inp, &line, NULL, NULL, &err) == G_IO_STATUS_NORMAL && *line != '\n' ) {
        gchar ** pwrd, ** words = g_strsplit_set(line, DELIM, -1);
        GSList * node, * list = NULL;
        
        for ( pwrd = words; *pwrd; ++pwrd )
            if ( **pwrd )
                list = g_slist_prepend(list, (gpointer)*pwrd);
        
        g_print("Unique words:\n");
        for ( node = list; node; node = g_slist_next(node) )
            if ( g_slist_find_custom(list, node->data, (GCompareFunc)g_strcmp0) == node && g_slist_find_custom(g_slist_next(node), node->data, (GCompareFunc)g_strcmp0) == NULL )
                g_print("%s\n", (gchar*)node->data);
        
        g_slist_free(list);
        g_strfreev(words);
    }
    
    if ( err )
        g_error("%s\n", err->message);
    
    return 0;
}

Объяснение кода листинга программы

В этом коде на языке C выполняется следующая последовательность действий:

  1. Включается библиотека Glib.
  2. Определяется строка-разделитель.
  3. Создается файловый дескриптор для стандартного ввода.
  4. Проверяется возможность создания файлового дескриптора. Если это невозможно, выводится сообщение об ошибке и программа завершается.
  5. Пока пользователь вводит строку, она читается по одному слову.
  6. Слова разделяются на отдельные слова и добавляются в список уникальных слов, если они еще не были добавлены.
  7. Если слово уже есть в списке, оно игнорируется.
  8. Выводится список уникальных слов.
  9. Список уникальных слов и словаря освобождаются.
  10. Если была зафиксирована ошибка, выводится сообщение об ошибке и программа завершается.
  11. Возвращается 0, чтобы указать, что программа успешно завершилась.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы