Переделать двусвязный список в односвязный список - C (СИ)
Формулировка задачи:
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//---------------------------------------------------------------------------
void main(void)
{char c;
int key=0;
struct symbol{
char symb;
struct symbol *next;
struct symbol *prev;
}*Start,*Temp;
printf ("Для завершения ввода строки нажмите Enter\n");
Start=(struct symbol *)malloc(sizeof(struct symbol));
Start->symb=getchar();
Start->prev=NULL;
if(!Start) {
printf("Oshibka raspredelenia pamyati\n");
exit(1);
}
for (Temp=Start; (c=getchar())!='\n'; ) {
Temp->next=(struct symbol *)malloc(sizeof(struct symbol));
if(!(Temp->next)) {
printf("Oshibka raspredelenia pamyati\n");
exit(1);
}
Temp->next->prev=Temp;
Temp=Temp->next;
Temp->symb=c;
Temp->next=NULL;
}
printf ("\nNaydennie slova c 2 (kak minimum) povtor sosed bukvi:");
for (Temp=Start; (Temp->next)!=NULL; Temp=Temp->next) {
if (((Temp->symb)!=' ') && ((Temp->symb)==(Temp->next->symb))) {
putchar('\n');
key++;
for (; ((Temp!=Start) && ((Temp->symb)!=' ')); Temp=Temp->prev) {}
for (Temp=Temp->next; (((Temp->symb)!=' ') && (Temp!=NULL)); Temp=Temp->next) {putchar(Temp->symb);}
Temp=Temp->prev;
}
}
if (!key) {printf("\nTrebuemih slov not!!!");}
else printf("\nНапечатано %d слов", key);
while (Start!=NULL) {
Temp=Start;
Start=Start->next;
free(Start);
}
getch();
}
Прошу вас очень нужно!!!
Решение задачи: «Переделать двусвязный список в односвязный список»
textual
Листинг программы
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
//---------------------------------------------------------------------------
int main() {
char c;
int key = 0, space;
struct symbol {
char symb;
struct symbol* next;
} * start, * temp, *p;
printf("Для завершения ввода строки нажмите Enter\n");
start = (struct symbol*) malloc(sizeof(struct symbol));
if (!start) {
printf("Oshibka raspredelenia pamyati\n");
return 1;
}
start->symb = getchar();
start->next = NULL;
for (temp = start; (c = getchar()) != '\n';) {
temp->next = (struct symbol*)malloc(sizeof(struct symbol));
if (!(temp->next)) {
printf("Oshibka raspredelenia pamyati\n");
return 1;
}
temp = temp->next;
temp->symb = c;
temp->next = NULL;
}
space = (start->symb == ' ');
for (p = temp = start; temp; temp = temp->next) {
if (temp->symb == ' ') {
space = 1;
}
else {
if (space) {
space = 0;
p = temp;
}
if (temp->next && (temp->symb == temp->next->symb)) {
key++;
for (; p && (p->symb != ' '); p = p->next) {
putchar(p->symb);
}
putchar('\n');
if (p == NULL) {
break;
}
temp = p;
}
}
}
if (!key) {
printf("Trebuemih slov not!!!\n");
}
else {
printf("Напечатано %d слов\n", key);
}
while (start != NULL) {
temp = start;
start = start->next;
free(temp);
}
system("pause");
return 0;
}
Объяснение кода листинга программы
В этом коде создается список символов, вводимых пользователем. Затем происходит преобразование списка в односвязный список. Код выводит на экран все слова, состоящие из одинаковых букв, и подсчитывает количество таких слов. После этого исходный двусвязный список освобождается от выделенной для него памяти.