Написать функции переворота списка путём изменения ссылок - C (СИ)
Формулировка задачи:
Помогите решить такую задачу. Я создаю односвязный список, ввожу в него элементы, но почему-то не работает функция вывода всего списка на экран(после некоторых модификаций видимо случайно что-то изменил, после чего она перестала работать.
Так же не могу написать функции переворота списка путём изменения ссылок, так чтобы элементы были записаны в обратном порядке и добавление элемента перед определённым элементом.
Вот собственно код на сколько сам смог написать
#include <stdio.h> #include <string.h> #include <conio.h> #include <stdlib.h> struct List { int num; List *next; }; void printmenu(){ printf("\nChoose action number: "); printf("\n1. Input"); printf("\n2. Add beefor last"); printf("\n3. Association two list"); printf("\n4. Turn the lust"); printf("\n5. Show all"); printf("\n6. Exit\n"); } List *Add(List *root) { List *tmp=new List; List *p; printf("Enter number "); scanf("%d",&(tmp->num)); tmp->next=NULL; if(root==NULL) { return tmp; } else { p=root; while(p->next!=NULL) { p=p->next; } p->next=tmp; return root; } } void ShowAll(List *root) { while(root) { printf("%d ; ",root->num); root=root->next; } } int main() { List *root=NULL,*tmp; char ch[10]; int k; while(1) { printmenu(); scanf("%s",ch); k=atoi(ch); switch(k){ case 1: { system("cls"); int a,b=0; printf("\nHow much element do you want add? "); scanf("%d",&a); while(b<a) { root=Add(root); b++; } }; break; case 2: case 3: case 4: case 5: system("cls"); ShowAll(root); printf("\n"); break; case 6: exit(0); default: printf("\nIncorrect input. Press any key to continue\n"); getch(); system("cls"); } while(tmp=root){ root=root->next; delete tmp; } } return 0; }
Решение задачи: «Написать функции переворота списка путём изменения ссылок»
textual
Листинг программы
#include <cstdlib> #include <iostream> using namespace std; //Create struct struct Mezgl { int data; Mezgl *link; }; //CreateMezgl Mezgl *CreateMezgl () { Mezgl *newMezgl; //1 newMezgl = new Mezgl; //2 cout<<"\nIevadiet skaitli, kuru pievienot: "; cin>>newMezgl->data; //3 newMezgl->link=NULL; //4 return newMezgl; //5 } //PrintList void PrintList (Mezgl *head) { Mezgl *cur; cout<<"Saraksta elementi:\n"; cur=head; int a=0; while (cur!=NULL) {a++; cout<<cur->data<<" "; cur=cur->link; } if (a==0) cout<< "Saraksta nav neviena elementa!"; } //AddFirst Mezgl *AddFirst (Mezgl *head, Mezgl *newMezgl) { newMezgl->link=head; head=newMezgl; return head; } //Find Mezgl *Find (Mezgl *head, int x) {Mezgl *cur; cur=head; //1 while (cur !=NULL && cur->data != x) cur=cur->link; //2 return cur; //3 } //AddAfter Mezgl void AddAfter (Mezgl *head, Mezgl *cur, Mezgl *newMezgl) { newMezgl->link = cur->link; cur->link = newMezgl; } //AddLast Mezgl Mezgl *AddLast (Mezgl *head, Mezgl *newMezgl) { Mezgl *cur; cur=head; if (!head) {head=AddFirst(head, newMezgl); return head;} while (cur->link) cur=cur->link; AddAfter(head, cur,newMezgl); return head; } //AddBefore Mezgl Mezgl *AddBefore (Mezgl *head, Mezgl *Find, Mezgl *newMezgl) { Mezgl *cur; cur=head; if (head==Find) {head=AddFirst(head,newMezgl); return head;} while (cur && cur->link!=Find) cur=cur->link; AddAfter(head,cur,newMezgl); return head; } //DeleteFirst Mezgl Mezgl *DeleteFirst (Mezgl *head) { Mezgl *cur; cur=head; delete head; cur=cur->link; head=cur; return head; } //DeleteLast Mezgl Mezgl*DeleteLast (Mezgl *head) { Mezgl *cur, *p; cur=head; p=head; if (cur->link==NULL) { head=DeleteFirst(head); return head; } else {cur=cur->link; while (cur->link!=NULL) { p=cur; cur=cur->link; } p->link=NULL; delete cur; return head; } } // DeleteAfter; Mezgl*DeleteAfter (Mezgl *head) { Mezgl *cur, *n, *p; int x; cur=head; p=head; cout<<"Pec kura simvola nodzest - "; cin>>x; cur=Find(head,x); if (cur==NULL) cout<<"\nMeklejama skaitla nav\n"; else { cur=head; while (cur->data!=x) { cur=cur->link; p=cur; } if (cur->link!=NULL) {cur=cur->link; n=cur; if (cur->link!=NULL) {cur=cur->link; p->link=n->link; delete n; return head;} else {delete cur; p->link=NULL; return head;} } else {cout<<"Nau ko dzest!";} return head; } } // DeleteBefore; Mezgl*DeleteBefore (Mezgl *head) { Mezgl *cur, *n, *p; int x; cur=head; p=head; cout<<"Pirms kura simvola nodzest - "; cin>>x; cur=Find(head,x); if (cur==NULL) cout<<"\nMeklejama skaitla nav\n"; else { cur=head; while (cur->data!=x) { cur=cur->link; p=cur; } p=cur; if (cur!=head){cur=head; while (cur->link!=p) {{ cur=cur->link; n=cur; } n=cur; } if (cur!=head){cur=head; while (cur->link!=n) { cur=cur->link; } cur->link=n->link; delete n; return head; } else {delete head;cur=cur->link;head=cur;return head;}} else {cout<<"Nau ko dzest!";} return head; } } // Elementu Skaits; void ElementuSk (Mezgl *head) { Mezgl *cur; cout<<"Saraksta elementi skaits ir: "; cur=head; int a=0; while (cur!=NULL) {a++; cur=cur->link; } cout<<a; } int main(int argc, char *argv[]) { Mezgl *head=NULL, *cur, *newMezgl; int x, izv; do { cout<<"\n"; cout<<"1. AddFirst\n"; cout<<"2. AddLast\n"; cout<<"3. AddAfter\n"; cout<<"4. AddBefore\n"; cout<<"5. DeleteFirst\n"; cout<<"6. DeleteLast\n"; cout<<"7. DeleteAfter\n"; cout<<"8. DeleteBefore\n"; cout<<"9. Find\n"; cout<<"10. PrintList\n"; cout<<"11. Elementu skaits\n"; cout<<"0. Exit\n"; cin>>izv; switch(izv) //Add Funkcion { case 1: newMezgl=CreateMezgl(); head=AddFirst(head,newMezgl); break; case 2: { newMezgl=CreateMezgl(); AddLast(head, newMezgl);break; } case 3: cout<<"Pec kura mezgla ielikt "; cin>>x; cur=Find(head,x); if (cur==NULL) cout<<"\nTaada skaitla nav\n"; else { newMezgl=CreateMezgl(); AddAfter(head, cur,newMezgl); } break; case 4: cout<<"Pirms kura mezgla ielikt "; cin>>x; cur=Find(head,x); if (cur==NULL) cout<<"\nTaada skaitla nav\n"; else { newMezgl=CreateMezgl(); head=AddBefore(head, cur,newMezgl); } break; //Delete Funkcion case 5: if (!head) break; else head=DeleteFirst(head); break; case 6: if (!head) break; else DeleteLast(head); break; case 7: if (!head) break; else DeleteAfter(head); break; case 8: if (!head) break; else head=DeleteBefore(head); break; case 9: cout<<"Ko mekleet "; cin>>x; cur=Find(head,x); if (cur==NULL) cout<<"\nTaada skaitla nav\n"; else cout<<"\n"<<x<<"atrada!"<<"\n"; break; case 10: PrintList(head); break; case 11: ElementuSk(head); break; case 0: cout<<"\nExit"<<"\n"; break; default: cout<<"\nNepareiza izveele!"<<"\n"; } } while(izv!=0); system("PAUSE"); return EXIT_SUCCESS; }
Объяснение кода листинга программы
В данном коде реализована реализация связанного списка с использованием структуры Mezgl, содержащей поля data (данные) и link (ссылка на следующий элемент). Список функций включает в себя:
- CreateMezgl - создает новый элемент списка, заполняет его данными и возвращает указатель на новый элемент.
- PrintList - выводит все элементы списка на экран.
- AddFirst - добавляет новый элемент в начало списка.
- AddLast - добавляет новый элемент в конец списка.
- AddAfter - добавляет новый элемент после указанного элемента списка.
- AddBefore - добавляет новый элемент перед указанным элементом списка.
- DeleteFirst - удаляет первый элемент из списка.
- DeleteLast - удаляет последний элемент из списка.
- DeleteAfter - удаляет элемент после указанного элемента списка.
- DeleteBefore - удаляет элемент перед указанным элементом списка.
- ElementuSk - выводит количество элементов в списке.
- Find - находит элемент списка по заданному значению. Функции операций с элементами списка (AddFirst, AddLast, AddAfter, AddBefore, DeleteFirst, DeleteLast, DeleteAfter, DeleteBefore) работают с указателями на начало и конец списка, а также с текущим элементом, чтобы выполнить требуемую операцию. Функции операций поиска (Find) и подсчета элементов (ElementuSk) используют цикл while для перебора всех элементов списка до достижения нулевого значения указателя link, что означает достижение конца списка. Функция main() является точкой входа в программу и содержит основной цикл do-while, который повторяет выполнение операций с списком до тех пор, пока пользователь не введет команду выхода (izv=0).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д