Автор Тема: линеен двусвързан списък  (Прочетена 5877 пъти)

theenemy

  • Участници
  • ***
  • Публикации: 9
    • Профил
1.   Да се състави линеен двусвързан списък за част от владетелите от Първата Българска Държава (около 8-10 записа). В структура да се дава :
името (и титлата);
години на царуване – начална, крайна
  Програмата да дава чрез меню:
А) Добавяне на владетел в началото и края.
Б) Добавяне на владетел след владетел със зададено име.
В) Изтриване на владетел – в началото, в края, при  посочено име.
Г) Да търси владетел с дадено име и да дава неговия наследник и предшественик.
Д) Да извежда на екрана владетелите, царували повече от 10 години.
Е) Разпечатване на целия списък;


имам една примерна програма със двупосочен списък, която може да помогне, но нямам никаква представа как :D. Ако нямой може да помогне, ще съм му много благодарен :)

Код
GeSHi (C):
  1. #include<iostream.h>
  2. #include<stdio.h>
  3.  
  4. typedef struct node
  5. {
  6. int value;    //value stored in the node
  7. node *next;   //ukazatel kym sledvashtia element
  8. node *prev;   //ukazatel kym predishnia element
  9. }  node;
  10.  
  11. node *front;       //ukazatel kym nachaloto na spisyka
  12. node *back;        //ukazatel kym kraia na spisyka
  13.  
  14. // prototipi (deklaracii) na vsichki izpolzvani funkcii
  15. void insertFront(int value);
  16. void insertBack(int value);
  17. void removeFront();
  18. void removeBack();
  19. void insertBefore(int value,node *nodeB);
  20. void insertAfter(int value,node *nodeA);
  21. void removeBefore(node *nodeB);
  22. void removeAfter(node *nodeA);
  23. void removeNode(node *newNode);
  24. void insertNodeFromBegin(int value, int n);
  25. void insertNodeFromEnd(int value, int n);
  26. void removeNodeFromBegin(int n);
  27. void removeNodeFromEnd(int n);
  28. void printDListFront();
  29. void printDListBack();
  30.  
  31. //vmykva element predi nodeB
  32. void insertBefore(int value,node *nodeB)
  33. {
  34. node *newNode;
  35. newNode=new node;
  36. newNode->prev=nodeB->prev;
  37. newNode->next =nodeB;
  38. newNode->value =value;
  39. if(nodeB->prev==NULL)
  40. {
  41. front=newNode;
  42. }
  43. else{
  44. nodeB->prev->next=newNode;
  45. }
  46. nodeB->prev=newNode;
  47. // removeNode(newNode);
  48. }
  49.  
  50. // vmykva element predi pyrviat element
  51. void insertFront (int value)
  52. {
  53. node *newNode;
  54. if(front==NULL)
  55. {
  56. newNode=new node;
  57. front=newNode;
  58. back =newNode;
  59. newNode->prev=NULL;
  60. newNode->next=NULL;
  61. newNode->value=value;
  62. }
  63. else
  64. {
  65. insertBefore(value,front );
  66. }
  67. }
  68.  
  69. // vmykva element sled nodeB
  70. void insertAfter(int value,node *nodeB)
  71. {
  72. node *newNode;
  73. newNode=new node;
  74. newNode->next= nodeB->next ;
  75. newNode->prev  =nodeB;
  76. newNode->value =value;
  77.  
  78. if(nodeB->next==NULL)
  79. {
  80. back =newNode;
  81. }
  82. else{
  83. nodeB->next->prev=newNode;
  84. }
  85. nodeB->next=newNode;
  86. }
  87. // vmykva element sled poslednia element
  88. void insertBack (int value)
  89. {
  90. if(back==NULL)
  91. {
  92. // cout<<"insert at back";
  93. insertFront(value);
  94. }
  95. else
  96. {
  97. // cout<<"insert at back";
  98. insertAfter(value,back  );
  99. }
  100. }
  101.  
  102. //trie nachalnia element
  103. void removeFront ()
  104. {
  105. removeNode(front);
  106. }
  107.  
  108. //trie poslednia element
  109. void removeBack()
  110. {
  111. removeNode(back);
  112. }
  113.  
  114. //trie predi posochenia element
  115. void removeBefore(node *nodeB)
  116. {
  117.  
  118. if(nodeB->prev==front)
  119. {
  120. front=nodeB;
  121. front->prev=NULL;
  122. }
  123. else
  124. {
  125.     removeNode(nodeB->prev);
  126. }
  127. }
  128.  
  129. //trie sled  posochenia element
  130. void removeAfter(node *nodeA)
  131. {
  132. if(nodeA->next==back)
  133. {
  134. back=nodeA;
  135. back->next=NULL;
  136. }
  137. else
  138. {
  139. removeNode(nodeA->next);
  140. }
  141. }
  142.  
  143. //trie posochenia element
  144. void removeNode(node *nodeToRemove)
  145. {
  146. if(nodeToRemove==front)
  147. {
  148. front=front->next;
  149. front->prev=NULL;
  150. }
  151. else if (nodeToRemove==back)
  152. {
  153. back=back->prev;
  154. back->next=NULL ;
  155. }
  156. else
  157. {
  158. nodeToRemove->prev->next=nodeToRemove->next;
  159. nodeToRemove->next->prev=nodeToRemove->prev;
  160. }
  161. }
  162. //dobavia sled "n"-ia element, zapochvaiki otnachalo
  163. void insertNodeFromBegin(int value, int n)
  164. {
  165. node *nodeToInsert = front;
  166. int i;
  167.  
  168. if (n==0 && front == NULL){
  169. insertFront(value);
  170. return;
  171. }
  172. if (n>0 && front == NULL){
  173. cout<<"spisyka ima po malko ot "<<n<<" elementi"<<endl;
  174. return;
  175. }
  176. for (i=0;i < n-1;i++)
  177. {
  178. nodeToInsert=nodeToInsert->next;
  179. if(nodeToInsert==NULL){
  180. cout<<"spisyka ima po malko ot "<<n<<" elementi"<<endl;
  181. // tuk "return"  e zadyljitelen
  182. return;
  183. }
  184. }
  185. insertAfter(value,nodeToInsert);
  186. }
  187. //dobavia predi "n"-ia element, zapochvaiki otkraia
  188. void insertNodeFromEnd(int value, int n)
  189. {
  190. node *nodeToInsert = back;
  191. int i;
  192.  
  193. if (n==0 && back == NULL){
  194. insertFront(value);
  195. return;
  196. }
  197. if (n>0 && back == NULL){
  198. cout<<"spisyka ima po malko ot "<<n<<" elementi"<<endl;
  199. return;
  200. }
  201.  
  202. for (i=0;i < n-1;i++)
  203. {
  204. nodeToInsert=nodeToInsert->prev;
  205. if(nodeToInsert==NULL){
  206. cout<<"spisyka ima po malko ot "<<n<<" elementi"<<endl;
  207. // tuk "return"  e zadyljitelen
  208. return;
  209. }
  210. }
  211. // if(nodeToInsert->prev == NULL){
  212. // insertBefore(value,front);
  213. // }
  214. // else{
  215. insertBefore(value,nodeToInsert);
  216. // }
  217. }
  218. //trie "n"-ia element, zapochvaiki otnachalo
  219. void removeNodeFromBegin(int n)
  220. {
  221. node *nodeToRemove = front;
  222. int i;
  223. for (i=0;i < n-1;i++)
  224. {
  225. nodeToRemove=nodeToRemove->next;
  226. if(nodeToRemove==NULL){
  227. cout<<"spisyka ima po malko ot "<<n<<" elementi"<<endl;
  228. // tuk "return"  e zadyljitelen
  229. return;
  230. }
  231. }
  232. removeNode(nodeToRemove);
  233. }
  234. //trie "n"-ia element, zapochvaiki otkraia
  235. void removeNodeFromEnd(int n)
  236. {
  237. node *nodeToRemove = back;
  238. int i;
  239. for (i=0;i < n-1;i++)
  240. {
  241. nodeToRemove=nodeToRemove->prev;
  242. if(nodeToRemove==NULL){
  243. cout<<"spisyka ima po malko ot "<<n<<" elementi"<<endl;
  244. // tuk "return"  e zadyljitelen
  245. return;
  246. }
  247. }
  248. removeNode(nodeToRemove);
  249. }
  250.  
  251. //Pechata spisyka ot nachaloto
  252. void printDListFront()
  253. {
  254. node* p1;
  255. p1= front;
  256. // cout<<"\n-----\n";
  257. cout<<"\n Spisyka sega e:\n";
  258. // cout<<"Queue\n";
  259. // cout<<"-----\n";
  260. while(p1!=NULL)
  261. {
  262. cout<<" |"<<p1->value<<"|";
  263. p1=p1->next;
  264. }
  265. cout<<endl;
  266. }//
  267.  
  268.  
  269. // Pechata spisyka otzad napred
  270. void printDListBack()
  271. {
  272. node* p1;
  273. p1= back;
  274. // cout<<"\n-----\n";
  275. cout<<"\n Spisyka v obraten red sega e:\n";
  276. // cout<<"Queue\n";
  277. // cout<<"-----\n";
  278. while(p1!=NULL)
  279. {
  280. cout<<" |"<<p1->value<<"|";
  281. p1=p1->prev;
  282. }
  283. cout<<endl;
  284. }//
  285.  
  286. void main()
  287. {
  288. int a,val;;
  289. front=NULL;
  290. back=NULL;
  291.  
  292. a = 0;
  293. val= 12;
  294. cout << "\nShte dobavim element sys stoinost = "<<val<<" sled element nomer "<<a<<" ot nachaloto\n";
  295. insertNodeFromBegin(val, a);
  296. printDListFront ();
  297. a = 1;
  298. val= 13;
  299. cout << "\nShte dobavim element sys stoinost = "<<val<<" predi element nomer "<<a<<" ot kraia\n";
  300. insertNodeFromEnd(val, a);
  301. printDListFront ();
  302. getchar();
  303. insertBack(8);
  304. // printDListFront ();
  305. insertBack(5);
  306. // printDListFront ();
  307. insertBack(6);
  308. // printDListFront ();
  309. insertFront(1) ;
  310. // printDListFront ();
  311. insertFront(3) ;
  312. // printDListFront ();
  313. insertBack(7);
  314. printDListFront ();
  315. printDListBack ();
  316. getchar();
  317. a = 7;
  318. cout << "\nShte iztriem element nomer "<<a<<" ot nachaloto\n";
  319. removeNodeFromBegin(a);
  320. printDListFront ();
  321. getchar();
  322. a = 6;
  323. cout << "\nShte iztriem element nomer "<<a<<" ot kraia\n";
  324. removeNodeFromEnd(a);
  325. printDListFront ();
  326. a = 2;
  327. val= 12;
  328. cout << "\nShte dobavim element sys stoinost = "<<val<<" sled element nomer "<<a<<" ot nachaloto\n";
  329. insertNodeFromBegin(val, a);
  330. printDListFront ();
  331. a = 7;
  332. val= 18;
  333. cout << "\nShte dobavim element sys stoinost = "<<val<<" predi element nomer "<<a<<" ot kraia\n";
  334. insertNodeFromEnd(val, a);
  335. printDListFront ();
  336. removeFront();
  337. printDListFront ();
  338. removeBack();
  339. printDListFront ();
  340. }
  341.  



« Последна редакция: May 14, 2010, 10:13 от VladSun »
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: линеен двусвързан списък
« Отговор #1 -: May 09, 2010, 19:30 »
Какъв ти е проблема, че нямаш return на main-a ли?
Всъщност моя грешка, main() ти е деклариран като void, т.е. може и без return. Ето ти програмата:
« Последна редакция: May 09, 2010, 19:40 от backtolife »
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

theenemy

  • Участници
  • ***
  • Публикации: 9
    • Профил
Re: линеен двусвързан списък
« Отговор #2 -: May 09, 2010, 20:01 »
а това с какво да го отворя?
Активен

tyuio

  • Гост
Re: линеен двусвързан списък
« Отговор #3 -: May 09, 2010, 20:09 »
В смъсъл с какво да отвориш?
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: линеен двусвързан списък
« Отговор #4 -: May 09, 2010, 20:14 »
Код:
~$chmod +x hanovete
./hanovete
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

tyuio

  • Гост
Re: линеен двусвързан списък
« Отговор #5 -: May 09, 2010, 20:16 »
Еми не знам за вас, ма тоя код без малко преправяне няма да мине през моето g++. Говоря за изходния в началото.
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: линеен двусвързан списък
« Отговор #6 -: May 09, 2010, 20:18 »
Код
GeSHi (C++):
  1. using namespace std;

Това сложих на 3-тия ред.
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

tyuio

  • Гост
Re: линеен двусвързан списък
« Отговор #7 -: May 09, 2010, 20:20 »
моя изрично поиска да му дам int main() а и няма как да приеме че <iostream.h>! h  няма такова нещо аре за С библиотеката ясно.
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: линеен двусвързан списък
« Отговор #8 -: May 09, 2010, 20:21 »
Ммм да правилно, махнах h-то, но main()-а си остана void.
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

tyuio

  • Гост
Re: линеен двусвързан списък
« Отговор #9 -: May 09, 2010, 20:26 »
./spisak.cpp:287: error: ‘::main’ must return ‘int’

Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: линеен двусвързан списък
« Отговор #10 -: May 09, 2010, 20:48 »
Код:
#c++ file.cpp
И при мен минава...
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

tyuio

  • Гост
Re: линеен двусвързан списък
« Отговор #11 -: May 09, 2010, 20:50 »
Еми аз го оправям на  int ама незнам защо е така.
gcc version 4.4.3
е да де аз ползвам g++ ./
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: линеен двусвързан списък
« Отговор #12 -: May 09, 2010, 20:53 »
Код:
c++ --version
c++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

tyuio

  • Гост
Re: линеен двусвързан списък
« Отговор #13 -: May 09, 2010, 20:55 »
А сега де аз винаги срещам тоя проблем особенно с шибаните задачи от университета дето никога не бачкат ако не ги прегледам за разни такива неща.
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: линеен двусвързан списък
« Отговор #14 -: May 09, 2010, 20:56 »
gat3way ще каже, сигурен съм че знае :)
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше