Реализовать линейный список на основе односвязного линейного списка, определяемого своим началом - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Есть модуль, реализующий линейный список на основе односвязного линейного списка, определяемого своим началом. Завершить его реализацию.
Листинг программы
  1. /* owlist.h
  2. АТД LinList,
  3. реализованный через односвязный (однонаправленный) список
  4. (One-Way List)
  5. */
  6. #ifndef OWLIST_H
  7. #define OWLIST_H
  8. #if !defined(CORELIST_H)
  9. #include "corelist.h" /* определяет TypeItem */
  10. #endif
  11. struct TypeNode {TypeItem item;
  12. struct TypeNode *next;};
  13. typedef struct TypeNode **LinList; /* линейный список */
  14. typedef struct TypeNode *Node; /* узел списка */
  15. LinList initlist(void); /* Инициализация списка */
  16. Node makenode (TypeItem item ); /* Создание узла */
  17. void addtofront (LinList list, /* Добавление узла в начало */
  18. Node newnode); /* списка */
  19. void addtorear (LinList list, /* Добавление узла в конец */
  20. Node newNode); /* списка */
  21. void insafter (LinList list, /* Вставка узла в список */
  22. Node newnode, /* за указанным */
  23. Node p);
  24. void insbefore (LinList list, /* Вставка узла в список */
  25. Node newnode, /* перед указанным */
  26. Node s);
  27. Node deletenode (LinList list, /* Удаление узла */
  28. Node delnode);
  29. Node succ (LinList list, /* Следующий узел */
  30. Node node);
  31. Node prec (LinList list, /* Предыдущий узел */
  32. Node node);
  33. TypeItem item (Node node); /* Элемент узла */
  34. Node first (LinList list); /* Первый узел списка */
  35. Node last (LinList list); /* Последний узел списка */
  36. int empty (LinList list); /* Список пуст ? */
  37. int destroynode (Node node); /* Уничтожение
  38. изолированного узла */
  39. void destroylist (LinList list) ; /* Уничтожение списка */
  40. #endif
Листинг программы
  1. /* owlist.c
  2. Односвязный (однонаправленный) линейный список (One-Way list)
  3. */
  4. #if !defined(OWLIST_H)
  5. #include "owlist.h"
  6. #endif
  7. #if !defined(__STDLIB_H)
  8. #include <stdlib.h>
  9. #endif
  10.  
  11. LinList initlist(void) /* Инициализация списка */
  12. {
  13. LinList list;
  14. list=malloc(sizeof list);
  15. if (list) *list=NULL;
  16. return (list);
  17. }
  18. Node makenode (TypeItem item) /* Создание узла */
  19. {
  20. Node node;
  21. node=malloc(sizeof(struct TypeNode));
  22. if (node) { node->item=item;
  23. node->next=NULL;
  24. }
  25. return (node);
  26. }
  27. void addtofront (LinList list, /* Добавление узла в начало */
  28. Node newnode) /* списка */
  29. {
  30. /* самостоятельно */
  31. }
  32. void addtorear (LinList list, /* Добавление узла в конец */
  33. Node newnode) /* списка */
  34. {
  35. if (list && /* список существует */
  36. newnode && newnode->next==NULL) { /* узел существует и изолирован */
  37. if (*list){
  38. Node p=*list;
  39. while (p->next) p=p->next;
  40. p->next=newnode;}
  41. else addtofront (list, newnode);
  42. }
  43. void insafter (LinList list, /* Вставка узла в список */
  44. Node newnode, /* за указанным */
  45. Node p)
  46. {
  47. /* самостоятельно */
  48. }
  49. void insbefore (LinList list, /* Вставка узла в список */
  50. Node newnode, /* перед указанным */
  51. Node s)
  52. {
  53. if (list && *list && s && /* список существует и не пуст, узлы */
  54. newnode && newnode->next==NULL) /* существуют и newnode изолирован */
  55. if (s == *list) { /* s - первый узел списка */
  56. newnode->next=s;
  57. *list=newnode;}
  58. else {
  59. TypeItem temp=s->item;
  60. s->item=newnode->item;
  61. newnode->item=temp;
  62. newnode->next=s->next;
  63. s->next=newnode;
  64. }
  65. }
  66. Node deletenode (LinList list, /* Удаление узла */
  67. Node delnode)
  68. {
  69. Node p;
  70. if (list && *list && delnode){ /* список существует и не пуст,
  71. и указанный узел есть */
  72. if (delnode->next){ /* если удаляемый узел не последний */
  73. TypeItem temp;
  74. p=delnode;
  75. delnode=p->next;
  76. temp=p->item;
  77. p->item=delnode->item;
  78. delnode->item=temp;
  79. p->next=delnode->next;
  80. delnode->next=NULL;
  81. }
  82. else if (delnode==*list) /* если удаляемый узел единственный в списке */
  83. *list=NULL;
  84. else { p=prec(list,delnode);
  85. p->next=NULL;}
  86. return(delnode);
  87. }
  88. else return (NULL);
  89. }
  90. Node succ (LinList list, /* Следующий узел */
  91. Node node)
  92. {
  93. /* самостоятельно */
  94. }
  95. Node prec (LinList list, /* Предыдущий узел */
  96. Node node)
  97. {
  98. if (list && *list && node && node != *list) {
  99. /* список существует и не пуст,
  100. и указанный узел есть и не первый */
  101. Node p=*list;
  102. while (p->next!=node && p->next!=NULL) p=p->next;
  103. if (p->next==node) return (p);
  104. }
  105. return (NULL); /* список list пуст, узел node первый
  106. или не содержится в указанном списке */
  107. }
  108. TypeItem item (Node node) /* Элемент узла */
  109. {
  110. /* самостоятельно */
  111. }
  112. Node first (LinList list) /* Первый узел списка */
  113. {
  114. /* самостоятельно */
  115. }
  116. Node last (LinList list) /* Последний узел списка */
  117. {
  118. /* самостоятельно */
  119. }
  120. int empty (LinList list) /* Список пуст ? */
  121. {
  122. /* самостоятельно */
  123. }
  124. int destroynode (Node node) /* Уничтожение изолированного узла */
  125. {
  126. if (node!=NULL && node->next==NULL){/* если node указывает на узел,
  127. который никуда не указывает
  128. (он может быть и последним
  129. узлом некоторого списка!) */
  130. free(node);
  131. return (0);}
  132. return (1); /* node указывает на неизолированный узел */
  133. }
  134. void destroylist (LinList list) /* Уничтожение списка */
  135. {
  136. if (list){
  137. Node n=*list, s;
  138. free(list);
  139. while (n) {
  140. s=n->next;
  141. free(n);
  142. n=s;
  143. }
  144. }
  145. }

Решение задачи: «Реализовать линейный список на основе односвязного линейного списка, определяемого своим началом»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4.  
  5. typedef struct _node {
  6.     void* ptr;
  7.     struct _node* next;
  8. } node;
  9.  
  10. typedef struct {
  11.     node* head;
  12.     node* tail;
  13.     size_t cnt;
  14. } slist;
  15.  
  16. static node* _prev_node(slist* lst, node* pos);
  17. static node* _new_node(slist* lst, node* pos, void* ptr);
  18. static node* _del_node(slist* lst, node* pos);
  19.  
  20. inline void   slist_init(slist* lst);
  21. inline size_t slist_size(slist* lst);
  22. inline int    slist_empty(slist* lst);
  23. int   slist_add_front(slist* lst, void* ptr);
  24. int   slist_add_back(slist* lst, void* ptr);
  25. node* slist_insert(slist* lst, node* pos, void* ptr);
  26. node* slist_delete(slist* lst, node* pos);
  27. void  slist_clear(slist* lst);
  28.  
  29.  
  30. int main(void){
  31.     int   i;
  32.     node* p;
  33.     slist lst;
  34.     slist_init(&lst);
  35.     for(i = 0; i < 20; ++i)
  36.         slist_add_back(&lst, (void*)(rand() % 10));
  37.     slist_add_front(&lst, (void*)4);
  38.  
  39.     for(p = lst.head; p != NULL; p = p->next)
  40.         printf("%d ", (int)p->ptr);
  41.     putchar('\n');
  42.  
  43.     //удалить все чётные числа
  44.     p = lst.head;
  45.     while(p != NULL){
  46.         if(!((int)p->ptr & 1)){
  47.             p = slist_delete(&lst, p);
  48.             continue;
  49.         }
  50.         p = p->next;
  51.     }
  52.  
  53.     for(p = lst.head; p != NULL; p = p->next)
  54.         printf("%d ", (int)p->ptr);
  55.     putchar('\n');
  56.  
  57.     //вставить -1 перед числом x < 6
  58.     p = lst.head;
  59.     while(p != NULL){
  60.         if((int)p->ptr < 6)
  61.             p = slist_insert(&lst, p, (void*)-1);
  62.         p = p->next;
  63.     }
  64.  
  65.     for(p = lst.head; p != NULL; p = p->next)
  66.         printf("%d ", (int)p->ptr);
  67.     slist_clear(&lst);
  68.     return 0;
  69. }
  70.  
  71.  
  72. //инициализация
  73. inline void slist_init(slist* lst){
  74.     lst->head = lst->tail = NULL;
  75.     lst->cnt  = 0;
  76. }
  77.  
  78. //кол-во
  79. inline size_t slist_size(slist* lst){
  80.     return lst->cnt;
  81. }
  82.  
  83. //проверка на валидность
  84. inline int slist_empty(slist* lst){
  85.     return (lst->head == NULL);
  86. }
  87.  
  88. //вставка в голову
  89. int slist_add_front(slist* lst, void* ptr){
  90.     return (_new_node(lst, lst->head, ptr) != NULL);
  91. }
  92.  
  93. //вставка в хвост
  94. int slist_add_back(slist* lst, void* ptr){
  95.     return (_new_node(lst, NULL, ptr) != NULL);
  96. }
  97.  
  98. //вставка в произвольное место
  99. node* slist_insert(slist* lst, node* pos, void* ptr){
  100.     return _new_node(lst, pos, ptr);
  101. }
  102.  
  103. //произвольное удаление
  104. node* slist_delete(slist* lst, node* pos){
  105.     return _del_node(lst, pos);
  106. }
  107.  
  108. //удаление всех
  109. void slist_clear(slist* lst){
  110.     node* t;
  111.     while(lst->head != NULL){
  112.         t = lst->head;
  113.         lst->head = lst->head->next;
  114.         free(t);
  115.     }
  116.     lst->tail = NULL;
  117.     lst->cnt  = 0;
  118. }
  119.  
  120.  
  121. //предыдущий узел
  122. static node* _prev_node(slist* lst, node* pos){
  123.     node* p = lst->head, *i = lst->head;
  124.     while((i != NULL) && (i != pos)){
  125.         p = i;
  126.         i = i->next;
  127.     }
  128.     return p;
  129. }
  130.  
  131. //создание элемента
  132. static node* _new_node(slist* lst, node* pos, void* ptr){
  133.     node* i, *p = (node*)malloc(sizeof(node));
  134.     if(p != NULL){
  135.         p->ptr  = ptr;
  136.         p->next = NULL;
  137.  
  138.         if(lst->head == NULL)
  139.             lst->head = lst->tail = p;
  140.         else {
  141.             if(pos == lst->head){
  142.                 p->next   = lst->head;
  143.                 lst->head = p;
  144.             } else if(pos == NULL)
  145.                 lst->tail = lst->tail->next = p;
  146.             else {
  147.                 i = _prev_node(lst, pos);
  148.                 i->next = p;
  149.                 p->next = pos;
  150.             }
  151.         }
  152.         ++(lst->cnt);
  153.     }
  154.     return p->next;
  155. }
  156.  
  157. //удаление элемента
  158. static node* _del_node(slist* lst, node* pos){
  159.     node* t, *p = NULL;
  160.     if(pos == lst->head)
  161.         p = lst->head = lst->head->next;
  162.     else {
  163.         p = _prev_node(lst, pos);
  164.         t = p->next = pos->next;
  165.         if(pos == lst->tail)
  166.             lst->tail = p;
  167.         p = t;
  168.     }
  169.     --(lst->cnt);
  170.     free(pos);
  171.  
  172.     if(lst->head == NULL)
  173.         lst->tail = NULL;
  174.     return p;
  175. }

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


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

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

5   голосов , оценка 3.8 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы