fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define go(ptr) ptr=ptr->next
  6.  
  7. //building structure
  8. struct data {
  9. int num;
  10. char *name;//name ptr
  11. float gpa;
  12. struct data *next;
  13. };
  14.  
  15. typedef struct data student;
  16.  
  17. //header initialize
  18. student *header = NULL;
  19.  
  20. //printing functions
  21. void printInstr() {
  22. printf("DATABASE PROGRAM\nuse i, u, d, D, f, l to run\n");
  23. }
  24. void printArrow() {
  25. printf("==>");
  26. }
  27.  
  28. //basis funtions
  29. student* lastNode() {
  30. student *last;
  31. for (last=header;last->next!=NULL;go(last));
  32. return last;
  33. }//returtn last node
  34. int lengthName(char *name_s) {
  35. int i;
  36. for (i=0;*(name_s+i)!='\0';i++);
  37. return i;
  38. }
  39. void insertHeader (int num_s, char *name_s, float gpa_s) {
  40. student *newNode;
  41. newNode=(student *)malloc(sizeof(student));
  42.  
  43. if (header == NULL) {
  44. newNode -> next=NULL;
  45. header=newNode;
  46. }//no nodes in list
  47. else {
  48. newNode->next=header;
  49. header=newNode;
  50. }//building a link
  51. newNode -> num=num_s;
  52. newNode -> name=(char*)malloc(sizeof(char)*(lengthName(name_s)+1));
  53. strcpy(newNode->name,name_s);
  54. newNode -> gpa=gpa_s;
  55. }
  56. void insertNew (student *node, int num_s, char *name_s, float gpa_s) {
  57. student *newNode;
  58. newNode=(student *)malloc(sizeof(student));
  59.  
  60. if (node == NULL) {
  61. newNode->next = NULL;
  62. node = newNode;
  63. }//'node' is NULL
  64. else {
  65. newNode->next=node->next;
  66. node->next=newNode;
  67. }
  68. newNode -> num=num_s;
  69. newNode -> name=(char*)malloc(sizeof(char)*(lengthName(name_s)+1));
  70. strcpy(newNode->name,name_s);//copy name
  71. newNode -> gpa=gpa_s;
  72. }
  73. void printNode (student *node) {
  74. printf("NUM: %5d NAME: %10s GPA: %.2f\n",node->num,node->name,node->gpa);
  75. }
  76.  
  77.  
  78. //funtions
  79. void printList() {
  80. student *curr=header; student *prev=header;
  81. int i,j;
  82. if (header==NULL) { printArrow(); printf("NO node in List..\n"); }//no nodes in List
  83. else { printArrow(); printf("Nodes in the List..\n");
  84. for (i=0;curr!=NULL;i++)
  85. go(curr); //determine size of List
  86. curr=header;
  87. for(;i>0;i--) {
  88. for(j=1;j<i;go(curr),j++);
  89. printNode(curr);
  90. curr=header;
  91. }//double loop to access nodes reversly
  92. }
  93. }
  94. void insertStudent(int num_s, char *name_s, float gpa_s) {
  95. student *prev=header; student *curr=header;
  96. int rpt=0;//to check error;repeated number..
  97.  
  98. if (header==NULL) insertHeader(num_s, name_s, gpa_s);//empty list
  99. else {
  100. for(prev=header;prev!=NULL;go(prev)) {
  101. if(prev->num==num_s) rpt++;
  102. }
  103. if (rpt!=0) {printArrow(); printf("No.%d is already in List..\n",num_s); }
  104. else {
  105. if (header->next==NULL) {
  106. if (header->num<num_s) insertHeader(num_s, name_s, gpa_s);
  107. else insertNew(header, num_s, name_s, gpa_s);
  108. } //only one node on list
  109. else {
  110. if (header->num<num_s) insertHeader(num_s, name_s, gpa_s);
  111. else {
  112. while (curr->num>num_s&&curr!=NULL) {
  113. prev=curr;
  114. go(curr);
  115. }
  116. insertNew(prev, num_s, name_s, gpa_s);//insert new node
  117. }}}}
  118. }
  119. void deleteStudent(int num_s) {
  120. student *prev; student *curr;
  121. prev=header; curr=header;
  122.  
  123. if (header==NULL) { printArrow(); printf("NO node in List..\n"); }
  124. else if (header->next==NULL&&header->num==num_s) {
  125. printArrow(); printf("%d %s %.2f has been eliminated..\n"
  126. ,header->num,header->name,header->gpa);
  127. free(header->name);
  128. go(header);
  129. free(prev);//header is 'only' node in List
  130. header=NULL;//after touching 'header', initialize for safety..
  131. }
  132. else if (header->num==num_s&&header->next!=NULL) {
  133. printArrow(); printf("%d %s %.2f has been eliminated..\n"
  134. ,header->num,header->name,header->gpa);
  135. free(header->name);
  136. go(header);//manipulate header forward
  137. free(prev);//free header
  138. }
  139. else { go(curr);
  140. while (curr!=NULL) {
  141. if (curr->num==num_s) break;
  142.  
  143. prev=curr;
  144. go(curr);//go next
  145. }
  146. if (curr==NULL) {printArrow(); printf("NO No.%d in the List..\n",num_s);}//no num_s in List
  147. else {
  148. printArrow(); printf("%d %s %.2f has been eliminated..\n",curr->num,curr->name,curr->gpa);
  149. free(curr->name);
  150. prev->next=curr->next;
  151. free(curr);//delete node and reserve link between nodes..
  152. }
  153. }
  154. }//to delete node and announcement
  155. void clearNode(int num_s) {
  156. student *prev; student *curr;
  157. prev=header; curr=header; go(curr);
  158.  
  159. if (header==NULL);
  160. else if (header->num==num_s) {
  161.  
  162. free(header->name);
  163. go(header);
  164. free(prev);//free header
  165. }
  166. else {
  167. while (curr!=NULL) {
  168. if (curr->num==num_s) break;
  169.  
  170. prev=curr;
  171. go(curr);//go next
  172. }
  173. if (curr==NULL);
  174. else {
  175. free(curr->name);
  176. prev->next=curr->next;
  177. free(curr);//delete nodes..
  178. }
  179. }
  180. }//clear node without annoucement
  181. void findStudent(int num_s) {
  182. student *curr=header;
  183. if (header==NULL) { printArrow(); printf("NO node in List..\n"); }//empty list
  184. else {
  185. while (curr!=NULL) {
  186. if (curr->num==num_s) break;//break after find num_s
  187.  
  188. go(curr);//go next
  189. }
  190.  
  191. if (curr==NULL) { printArrow(); printf("NO No.%d in the List..\n",num_s); }
  192. else printNode(curr);
  193. }
  194. }
  195. void updateStudent(int num_s, char *name_s, float gpa_s) {
  196. student *curr=header; student *prev=header;
  197. if (header==NULL) { printArrow(); printf("NO node in List..\n"); }//empty list
  198. else {
  199. if (header->num==num_s) {
  200. clearNode(num_s);
  201. insertHeader(num_s,name_s,gpa_s);//header was only node and header->num==num_s..
  202. }
  203. else {
  204.  
  205. while (curr!=NULL) {
  206. if (curr->num==num_s) break;
  207.  
  208. prev=curr;
  209. go(curr);//go next
  210. }
  211. if (curr==NULL) { printf("NO No.%d in the List..\n",num_s); }
  212. else {
  213.  
  214. clearNode(num_s);
  215. insertNew(prev,num_s,name_s,gpa_s);
  216.  
  217. }}}
  218. }
  219. void deleteAll() {
  220. student *prev=header; student *curr=header;
  221. printArrow(); printf("Delete every node\n");
  222.  
  223. if (header==NULL) {/*do nothing*/}//no node in List
  224. else {
  225. if (header->next == NULL) { //only one node in List
  226. free(header->name);
  227. free(header);
  228. header=NULL;//initialize header to avoid error..
  229. }
  230. else {
  231. go(curr);
  232.  
  233. while(curr!=NULL) {
  234. free(curr->name);//free name
  235. free(prev);//free node
  236.  
  237. prev=curr;
  238. go(curr);
  239. }
  240. free(prev);//delete last node
  241. header=NULL;//initialize to avoid error..
  242. }}
  243. }
  244.  
  245. int main () {
  246. char instr;
  247. char name_s[10];
  248. int num_s;
  249. float gpa_s;
  250.  
  251. printInstr();
  252.  
  253. while (instr!='q') {
  254. fflush(stdin);
  255. scanf("%c",&instr);
  256.  
  257. switch (instr) {
  258. case 'i' :
  259. scanf("%d %s %f",&num_s,name_s,&gpa_s);
  260. insertStudent(num_s, name_s, gpa_s);
  261. //insert node
  262. break;
  263. case 'u' :
  264. scanf("%d %s %f",&num_s,name_s,&gpa_s);
  265. //update
  266. updateStudent(num_s,name_s,gpa_s);
  267. break;
  268. case 'f' :
  269. scanf("%d",&num_s);
  270. findStudent(num_s);
  271. //find
  272. break;
  273. case 'd' :
  274. scanf("%d",&num_s);
  275. deleteStudent(num_s);
  276. //delete one
  277. break;
  278. case 'D' :
  279. deleteAll();
  280. //delete all
  281. break;
  282. case 'l' :
  283. printList();
  284. break;
  285. case 'q' :
  286. printArrow();
  287. printf("Good bye..\n");
  288. }
  289. }
  290.  
  291. return 0;
  292. }
Time limit exceeded #stdin #stdout 5s 2256KB
stdin
Standard input is empty
stdout
Standard output is empty