Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.40 KB | None | 0 0
  1. #include<iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct nodo{
  6.     int info;
  7.     nodo*next;
  8.    
  9.     nodo(int a=0, nodo*b=0) {
  10.         info=a;
  11.         next=b;
  12.     }
  13. };
  14.  
  15. // funzioni per input e output
  16. nodo *buildL(int k) {
  17.     if(!k)
  18.         return 0;
  19.    
  20.     int x;
  21.     cin>>x;
  22.     return new nodo(x,buildL(k-1));
  23. }
  24.  
  25. void leggiA(int*A,int k) {
  26.     for(int i=0; i<k; i++)
  27.         cin>>A[i];
  28. }
  29.  
  30. nodo* clone(nodo*L) {
  31.     if(!L)
  32.         return 0;
  33.    
  34.     return new nodo(L->info,clone(L->next));
  35. }
  36.  
  37. void stampa(nodo*L) {
  38.     if(!L) {
  39.         cout<<endl;
  40.         return;
  41.     }
  42.    
  43.     cout<<L->info<<' ';
  44.     stampa(L->next);
  45. }
  46.  
  47. void Fric(nodo*L, int*A, int dimA, nodo*&L1, nodo*&L2);
  48. void concat(nodo*& prima, nodo*& seconda);
  49. nodo* removeSubList(nodo*& start, int lunghezza);
  50.  
  51. main() {
  52.     cout<<"start"<<endl;
  53.    
  54.     int n, dimA, A[20];
  55.    
  56.     cin >> n >> dimA;
  57.     nodo*L=buildL(n);
  58.     stampa(L);
  59.  
  60.     leggiA(A,dimA);
  61.    
  62.     nodo*X=clone(L);
  63.     nodo*L1=0,*L2=0;
  64.    
  65.     Fric(L,A,dimA,L1,L2);
  66.     stampa(L1);
  67.     stampa(L2);
  68.    
  69.     stampa(L1);
  70.     stampa(L2);
  71.    
  72.     cout<<"end"<<endl;
  73. }
  74.  
  75. /* PRE=(lista(L), lista(L1), e lista(L2) sono ben formate,
  76.     A contiene dimA elementi non negativi,
  77.     con dimA pari >=0, vL=lista(L),vL1=lista(L1),vL2=lista(L2)) */
  78. void Fric(nodo*L, int*A, int dimA, nodo*&L1, nodo*&L2) {
  79.     if(!L)
  80.         return;
  81.    
  82.     if(dimA == 0) { // se ci sono degli elementi restanti
  83.         concat(L1, L);
  84.         return;
  85.     }
  86.    
  87.     // se L non e' vuota e dimA != 0
  88.     nodo *toAdd = removeSubList(L, A[0]);
  89.     concat(L1, toAdd);
  90.     toAdd = removeSubList(L, A[1]);
  91.     concat(L2, toAdd);
  92.    
  93.     Fric(L, A+2, dimA-2, L1, L2);
  94. }
  95. /* POST=(i nodi di vL sono distribuiti correttamente su 2 liste X1 e X2 secondo
  96. i valori di A e L1=vL1@X1 e L2=vL2@X2)*/
  97.  
  98. // funzione per concatenare due liste
  99. void concat(nodo*& prima, nodo*& seconda) {
  100.     if(!prima)
  101.         prima = seconda;
  102.     else
  103.         concat(prima->next, seconda);
  104. }
  105.  
  106. // una funzione ha lo scopo di individuare la porzione di L da “staccare” per poi aggiungerla ad L1 o ad L2
  107. nodo* removeSubList(nodo*& start, int lunghezza) {
  108.     if(!start || !lunghezza)
  109.         return NULL;
  110.        
  111.     nodo *toRemove = start;
  112.     start = start->next;
  113.     toRemove->next = removeSubList(start, lunghezza-1);
  114.     return toRemove;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement