Chinaunix首页 | 论坛 | 博客
  • 博客访问: 139734
  • 博文数量: 10
  • 博客积分: 2431
  • 博客等级: 大尉
  • 技术积分: 266
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-02 00:56
文章分类
文章存档

2016年(1)

2013年(2)

2011年(3)

2010年(4)

分类: C/C++

2016-02-25 21:11:26

程序源代码全部在此:
1. 链表: 数据结构定义链表没有头结点。增删节点的时候需要有判定头结点是否为空的代码。
2. 链表: 数据结构增加了头节点的定义,以一个元素的代价大大简化了判定的代码,大大提高了运行效率。典型的时间换空间。
3. 二叉树和节点遍历: 已知前序和中序遍历,求后续遍历的结果。
------------------------------
1. 链表源代码(无头结点):

点击(此处)折叠或打开

  1. struct node{
  2.     int data;
  3.     node* link;
  4. };
  5. node* create_node(int i)
  6. {
  7.     return new node{ i, nullptr };
  8. }
  9. void delete_node(node* n)
  10. {
  11.     if (n->link)
  12.         delete_node(n->link);
  13.     delete n;
  14. }
  15. struct list{
  16.     node* p;
  17. };
  18. list* create_list()
  19. {
  20.     return new list{ nullptr };
  21. }
  22. void delete_list(list* l)
  23. {
  24.     if (l->p)
  25.         delete_node(l->p);
  26.     l->p = nullptr;
  27. }
  28. void insert_node(list* l, node* n)
  29. {
  30.     node* tmp = l->p;
  31.     if (tmp == nullptr)
  32.         l->p = n;
  33.     else
  34.     {
  35.         while (tmp->link)
  36.             tmp = tmp->link;
  37.         tmp->link = n;
  38.     }
  39. }
  40. void remove_node(list* l, size_t idx)
  41. {
  42.     if (idx < 0)throw false;
  43.     node* p = l->p; //head
  44.     if (idx == 0)
  45.     {
  46.         l->p = p->link;
  47.     }
  48.     else
  49.     {
  50.         node* old = nullptr;
  51.         while (idx--)
  52.         {
  53.             if (p == nullptr)throw false;
  54.             old = p;
  55.             p = p->link;
  56.         }
  57.         old->link = p->link;
  58.     }
  59.     p->link = nullptr;
  60.     delete_node(p);
  61. }
  62. void display_list(list* l)
  63. {
  64.     node * p = l->p;
  65.     while (p)
  66.     {
  67.         cout << p->data << endl;
  68.         p = p->link;
  69.     }
  70. }
  71. int main()
  72. {
  73.     list* l = create_list();
  74.     insert_node(l, create_node(1));
  75.     insert_node(l, create_node(2));
  76.     insert_node(l, create_node(3));
  77.     insert_node(l, create_node(4));
  78.     display_list(l);
  79.     remove_node(l, 2);
  80.     remove_node(l, 0);
  81.     cout << "--------" << endl;
  82.     display_list(l);
  83.     delete_list(l);
  84.     return 0;
  85. }
2. 链表源代码(有头结点):

点击(此处)折叠或打开

  1. struct node{
  2.     int data;
  3.     node* link;
  4. };
  5. node* create_node(int i)
  6. {
  7.     return new node{ i, nullptr };
  8. }
  9. void delete_node(node* n)
  10. {
  11.     if (n->link)
  12.         delete_node(n->link);
  13.     delete n;
  14. }
  15. struct list{
  16.     node head;
  17. };
  18. list* create_list()
  19. {
  20.     return new list{ node{ -1, nullptr } };
  21. }
  22. void delete_list(list* l)
  23. {
  24.     if (l->head.link)
  25.         delete_node(l->head.link);
  26.     l->head.link = nullptr;
  27. }
  28. void insert_node(list* l, node* n)
  29. {
  30.     node* tmp = &l->head;
  31.     while (tmp->link)
  32.         tmp = tmp->link;
  33.     tmp->link = n;
  34. }
  35. void remove_node(list* l, size_t idx)
  36. {
  37.     if (idx <= 0)throw false;
  38.     node* p = l->head.link; //head
  39.     node* old = nullptr;
  40.     while (idx--)
  41.     {
  42.         if (p == nullptr)throw false;
  43.         old = p;
  44.         p = p->link;
  45.     }
  46.     old->link = p->link;
  47.     p->link = nullptr;
  48.     delete_node(p);
  49. }
  50. void display_list(list* l)
  51. {
  52.     node * p = l->head.link;
  53.     while (p)
  54.     {
  55.         cout << p->data << endl;
  56.         p = p->link;
  57.     }
  58. }
  59. int main()
  60. {
  61.     list* l = create_list();
  62.     insert_node(l, create_node(1));
  63.     insert_node(l, create_node(2));
  64.     insert_node(l, create_node(3));
  65.     insert_node(l, create_node(4));
  66.     display_list(l);
  67.     remove_node(l, 3);
  68.     remove_node(l, 2);
  69.     cout << "--------" << endl;
  70.     display_list(l);
  71.     delete_list(l);
  72.     return 0;
  73. }
3. 二叉树的遍历和重建

点击(此处)折叠或打开

  1. struct node
  2. {
  3.     node* left;
  4.     node* right;
  5.     char data;
  6. };
  7. struct tree
  8. {
  9.     node* root;
  10. };
  11. node* createNode(char i = -1)
  12. {
  13.     return new node{ nullptr, nullptr, i };
  14. }
  15. void destroyNode(node* n)
  16. {
  17.     if (n == nullptr)return;
  18.     if (n->left) destroyNode(n->left);
  19.     if (n->right) destroyNode(n->right);
  20.     delete n;
  21. }
  22. tree* createTree()
  23. {
  24.     return new tree{ nullptr };
  25. }
  26. void destroyTree(tree* t)
  27. {
  28.     destroyNode(t->root);
  29. }
  30. node* createRoot(tree* t, node* n)
  31. {
  32.     if (t->root) destroyNode(t->root);
  33.     t->root = n;
  34.     return n;
  35. }
  36. node* appendNode(node* n, node* parent = nullptr, bool isLeft = true)//false means right
  37. {
  38.     if (isLeft) parent->left = n;
  39.     else parent->right = n;
  40.     return n;
  41. }
  42. void traverseNode(node* n)
  43. {
  44.     if (n == nullptr)return;
  45.     traverseNode(n->left);
  46.     traverseNode(n->right);
  47.     cout << n->data << endl;
  48. }
  49. void traverseTree(tree* t)
  50. {
  51.     node* n = t->root;
  52.     traverseNode(n);
  53. }
  54. void rebuildTreeImpl(node* n, char* DLR, char* LDR, size_t length)
  55. {
  56.     if (length == 0)
  57.         return;
  58.     char root = DLR[0];
  59.     n->data = root;
  60.     size_t idx = 0;
  61.     for (; idx < length; ++idx)
  62.         if (root == LDR[idx])break;

  63.     char* newDLR = DLR + 1;
  64.     if (idx > 0) //has left sub tree
  65.     {
  66.         n->left = createNode();
  67.         rebuildTreeImpl(n->left, newDLR, LDR, idx);
  68.     }
  69.     if (idx < length - 1) //right sub tree
  70.     {
  71.         n->right = createNode();
  72.         rebuildTreeImpl(n->right, newDLR + idx, LDR + idx + 1, length - idx - 1);
  73.     }
  74. }
  75. tree* rebuildTree(char* DLR, char* LDR, size_t length)
  76. {
  77.     tree* t = createTree();
  78.     node* n = createNode();
  79.     t->root = n;
  80.     rebuildTreeImpl(n, DLR, LDR, length);
  81.     return t;
  82. }
  83. int main()
  84. {
  85.     char DLR[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I' };
  86.     char LDR[] = { 'B', 'C', 'A', 'E', 'D', 'G', 'H', 'F', 'I' };
  87.     static_assert(sizeof(DLR) == sizeof(LDR), "mismatch");
  88.     tree* t = rebuildTree(DLR, LDR, sizeof(DLR));
  89.     traverseTree(t);
  90.     destroyTree(t);
  91.     return 0;
  92. }

阅读(1626) | 评论(0) | 转发(0) |
0

上一篇:C++陷阱系列(2):让面试官倒掉的题--续

下一篇:没有了

给主人留下些什么吧!~~