Написать функции переворота списка путём изменения ссылок - 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 (ссылка на следующий элемент). Список функций включает в себя:

  1. CreateMezgl - создает новый элемент списка, заполняет его данными и возвращает указатель на новый элемент.
  2. PrintList - выводит все элементы списка на экран.
  3. AddFirst - добавляет новый элемент в начало списка.
  4. AddLast - добавляет новый элемент в конец списка.
  5. AddAfter - добавляет новый элемент после указанного элемента списка.
  6. AddBefore - добавляет новый элемент перед указанным элементом списка.
  7. DeleteFirst - удаляет первый элемент из списка.
  8. DeleteLast - удаляет последний элемент из списка.
  9. DeleteAfter - удаляет элемент после указанного элемента списка.
  10. DeleteBefore - удаляет элемент перед указанным элементом списка.
  11. ElementuSk - выводит количество элементов в списке.
  12. Find - находит элемент списка по заданному значению. Функции операций с элементами списка (AddFirst, AddLast, AddAfter, AddBefore, DeleteFirst, DeleteLast, DeleteAfter, DeleteBefore) работают с указателями на начало и конец списка, а также с текущим элементом, чтобы выполнить требуемую операцию. Функции операций поиска (Find) и подсчета элементов (ElementuSk) используют цикл while для перебора всех элементов списка до достижения нулевого значения указателя link, что означает достижение конца списка. Функция main() является точкой входа в программу и содержит основной цикл do-while, который повторяет выполнение операций с списком до тех пор, пока пользователь не введет команду выхода (izv=0).

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


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

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

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