Advertisement
Guest User

Untitled

a guest
Jan 20th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.23 KB | None | 0 0
  1.  
  2. List.h
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. typedef struct Node Node;
  7. typedef int Data_T;
  8. struct Node
  9. {
  10. Data_T val_;
  11. Node* next_;
  12. };
  13.  
  14.  
  15.  
  16. Node* Create_new (Node* el, Data_T val);
  17.  
  18. Node* Insert_end (Node* head, Data_T val);
  19. Node* Insert (Node* head, int num, Data_T val);
  20.  
  21. Node* Del (Node* head, Data_T key);
  22. void Print_List (Node* head);
  23. int List_size (Node* head);
  24. List.c
  25.  
  26. #include "list.h"
  27.  
  28.  
  29. Node* Create_new (Node* el, Data_T val)
  30. {
  31. el = malloc (sizeof (Node));
  32. el->val_ = val;
  33. el->next_ = NULL;
  34. return el;
  35. }
  36.  
  37. Node* Insert_end (Node* head, Data_T val)
  38. {
  39. Node* t = head;
  40. if (head == NULL)
  41. {
  42. head = Create_new (head, val);
  43. return head;
  44. }
  45. while (t->next_ != NULL) t = t->next_;
  46.  
  47. Node* nw = Create_new (nw, val);
  48.  
  49. t->next_ = nw;
  50. return head;
  51. }
  52.  
  53. Node* Insert (Node* head, int num, Data_T val)
  54. {
  55. Node* t = head;
  56. Node* nw = Create_new (nw, val);
  57. if (head == NULL)
  58. {
  59. if (num == 1)
  60. {
  61. head = Create_new (head, val);
  62. return head;
  63. }
  64. else
  65. {
  66. printf("Out of range.\n");
  67. return head;
  68. }
  69. }
  70. if (num == 1)
  71. {
  72. nw->next_ = head;
  73. return nw;
  74. }
  75. else
  76. {
  77. int i = 1;
  78. for (; i < num - 1 && t != NULL; i++)
  79. t = t->next_;
  80.  
  81. if (i < num - 1)
  82. {
  83. printf ("Out of range\n");
  84. return head;
  85. }
  86. nw->next_ = t->next_;
  87. t->next_ = nw;
  88. }
  89. return head;
  90. }
  91.  
  92. void Print_List (Node* head)
  93. {
  94. Node* t = head;
  95. if (head == NULL)
  96. {
  97. printf ("Empty\n");
  98. return;
  99. }
  100. while (t->next_ != NULL)
  101. {
  102. printf ("%d ", t->val_);
  103. t = t->next_;
  104. }
  105. printf ("%d\n", t->val_);
  106. }
  107.  
  108. int List_size (Node* head)
  109. {
  110. Node* t = head;
  111. if (head == NULL)
  112. {
  113. return 0;
  114. }
  115. int length = 0;
  116. while (t->next_ != NULL)
  117. {
  118. t = t->next_;
  119. length ++;
  120. }
  121. return ++length;
  122. }
  123.  
  124. Node* Del (Node* head, Data_T key)
  125. {
  126. Node* t = head;
  127. if (t->val_ != key)
  128. {
  129. if (t->next_ == NULL)
  130. {
  131. printf ("No such value\n");
  132. return head;
  133. }
  134. while (t->next_->val_ != key && t->next_->next_ != NULL) t = t->next_;
  135.  
  136. if (t->next_->val_ != key)
  137. {
  138. printf ("No such value\n");
  139. return head;
  140. }
  141.  
  142. Node* t1 = t->next_->next_;
  143. free (t->next_);
  144. t->next_ = t1;
  145. return head;
  146. }
  147. if (head->next_ != NULL)
  148. {
  149. Node* new_head = head->next_;
  150. free (head);
  151. return new_head;
  152. }
  153. else return NULL;
  154. }
  155. main.c
  156. #include <stdio.h>
  157. #include <string.h>
  158. #include <stdlib.h>
  159.  
  160. #include "list.h"
  161. int Max = 256;
  162.  
  163. Node* merge (Node* el1, Node* el2);
  164. Node* merge_sort (Node* head);
  165.  
  166. Node* merge(Node* el1, Node* el2)
  167. {
  168. Node* t1 = el1;
  169. Node* t2 = el2;
  170. Node* res = malloc (sizeof (Node));
  171. Node* el = res;
  172. while (1){
  173. if (t1 == NULL && t2 == NULL)
  174. break;
  175. if ((t1 == NULL) && (t2 != NULL)){
  176. el->val_ = t2->val_;
  177. t2 = t2->next_;
  178. if (t2 != NULL){
  179. el->next_ = malloc(sizeof(Node));
  180. el = el->next_;
  181. }
  182. }
  183. else if ((t2 == NULL) && (t1 != NULL)){
  184. el->val_ = t1->val_;
  185. t1 = t1->next_;
  186. if (t1 != NULL){
  187. el->next_ = malloc(sizeof(Node));
  188. el = el->next_;
  189. }
  190. }
  191. else if (t1->val_ <= t2->val_){
  192. el->val_ = t1->val_;
  193. el->next_ = malloc(sizeof(Node));
  194. el = el->next_;
  195. t1 = t1->next_;
  196. }
  197. else{
  198. el->val_ = t2->val_;
  199. el->next_ = malloc(sizeof(Node));
  200. el = el->next_;
  201. t2 = t2->next_;
  202. }
  203.  
  204.  
  205. }
  206. el->next_ = NULL;
  207. return res;
  208. }
  209.  
  210. Node* merge_sort (Node* head)
  211. {
  212. if (List_size(head)>2){
  213. int middle = (List_size(head)-1)/2;
  214. Node* h = head;
  215. Node* temp1 = malloc (sizeof (Node));
  216. Node* temp2 = temp1;
  217. Node* temp3 = malloc (sizeof (Node));
  218. Node* temp4 = temp3;
  219. Node* temp5 = malloc (sizeof (Node));
  220. Node* temp6 = malloc (sizeof (Node));
  221. temp1->val_ = h->val_;
  222. temp1->next_ = (Node*) malloc(sizeof(Node));
  223. temp1 = temp1->next_;
  224. h = h->next_;
  225. for (int i=0; i<middle-1; i++){
  226. temp1->val_ = h->val_;
  227. h = h->next_;
  228. temp1->next_ = (Node*) malloc(sizeof(Node));
  229. temp1 = temp1->next_;
  230. }
  231. temp1->val_ = h->val_;
  232. h = h->next_;
  233. temp1->next_ = NULL;
  234. temp3->val_ = h->val_;
  235. h = h->next_;
  236. if (h != NULL){
  237. temp3->next_ = (Node*) malloc(sizeof(Node));
  238. temp3 = temp3->next_;
  239. for (int i=middle+1; i<List_size(head)-2; i++){
  240. temp3->val_ = h->val_;
  241. temp3->next_ = (Node*) malloc(sizeof(Node));
  242. temp3 = temp3->next_;
  243. h = h->next_;
  244. }
  245. temp3->val_ = h->val_;
  246. }
  247. temp3->next_ = NULL;
  248. temp5 = merge_sort(temp2);
  249. temp6 = merge_sort(temp4);
  250. return merge(temp5, temp6);
  251. }
  252. else {
  253. if (head->next_ != NULL){
  254. Node* temp1 = head;
  255. Node* temp2 = head->next_;
  256. temp1->next_ = NULL;
  257. return merge(temp1, temp2);
  258. }
  259. else return head;
  260. }
  261. }
  262.  
  263. int main ()
  264. {
  265. Node* head = NULL;
  266. char str [Max];
  267. int t = 0;
  268. int t1 = 0;
  269. int n = 0;
  270. printf("Commands:\n");
  271. printf("i (index) <value> - insert value into the list\n");
  272. printf("p - print the list\n");
  273. printf("l - print the list size\n");
  274. printf("d <value> - delete the first occurance of value in the list\n");
  275. printf("s - sort the list\n");
  276. while (fgets (str, Max, stdin) != NULL)
  277. {
  278. switch (str [0])
  279. {
  280. case 'i' : n = sscanf (str, "i %d %d", &t, &t1);
  281. if (n == 2) head = Insert (head, t, t1);
  282. else if (n == 1) head = Insert_end (head, t);
  283. else printf("Wrong input.");
  284. break;
  285. case 'p' : Print_List (head);
  286. break;
  287. case 'l' : printf ("Size is %d\n", List_size (head));
  288. break;
  289. case 'd' : n = sscanf (str, "d %d", &t);
  290. if (head == NULL)
  291. {
  292. printf("List is empty.\n");
  293. break;
  294. }
  295. if (n == 1) head = Del (head, t);
  296. else printf("Wrong input.");
  297. break;
  298. case 's': if (List_size(head) <= 1);
  299. else head = merge_sort(head);
  300. break;
  301.  
  302. default : printf("Could not recognize the command.\n");
  303. break;
  304. }
  305. str [0] = 0;
  306. }
  307. return 0;
  308. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement