Вывести те элементы списка которые повторяются один раз - 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 выполняется следующая последовательность действий:
- Включается библиотека Glib.
- Определяется строка-разделитель.
- Создается файловый дескриптор для стандартного ввода.
- Проверяется возможность создания файлового дескриптора. Если это невозможно, выводится сообщение об ошибке и программа завершается.
- Пока пользователь вводит строку, она читается по одному слову.
- Слова разделяются на отдельные слова и добавляются в список уникальных слов, если они еще не были добавлены.
- Если слово уже есть в списке, оно игнорируется.
- Выводится список уникальных слов.
- Список уникальных слов и словаря освобождаются.
- Если была зафиксирована ошибка, выводится сообщение об ошибке и программа завершается.
- Возвращается 0, чтобы указать, что программа успешно завершилась.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д