当前位置:   article > 正文

双向循环链表操作的实现_编写循环双向链表的建立、求数据元素个数、插入、删除数据元素、正反二方向输出数

编写循环双向链表的建立、求数据元素个数、插入、删除数据元素、正反二方向输出数

之前做数据结构课程设计时遇到的一道小题,感觉对链表的知识覆盖比较广,对链表知识的理解挺有帮助的。

一、问题描述

双向循环列表进行如下操作:

1.建立一个空表。

2.在第i个位置插入新的元素x。

3.删除第i个位置上的元素。

4.取第i个位置上的元素。

5.返回元素x第一次出现在双向循环链表中的位置号。

6.求双向循环链表的长度,即元素个数。

7.输出双向循环链表中所有的元素值。

8.实现双向循环链表的就地逆置。

二、问题解析

1.创建空表

图1 创建空表

2.双向循环链表

图2 双向循环链表结构

3.插入

图3 插入前

图4 插入后

4.删除

图5 删除前

图6 删除后

5.就地逆置

图7 就地逆置前

图8 就地逆置过程

三、总体思路

(1)清楚双向循环链表的结构,写出双向循环链表的节点类。

(2)建立一个空的双向循环链表,即只有头结点。

(3)使用头插法建立一个双向循环链表。

(4)建立完成后弹出选项菜单进行选择并运行相关程序,包含插入、删除、取元素、返回位置号、求长度、输出所有元素、就地逆置等操作。

(5)根据用户意愿继续弹出菜单进行选择或者退出程序。

四、函数或类的具体定义和功能

函数

具体功能

DuLinkList

建立一个空表

insert

在第i个位置插入新的元素x

remove

删除第i个位置上的元素

length

求双向循环链表的长度,即元素个数

display

输出双向循环链表中所有的元素值

get

取第i个位置上的元素

indexOf

返回元素x第一次出现在双向循环链表中的位置号

reverse

实现双向循环链表的就地逆置

五、代码

  1. public class DuLinkList {
  2. public DuLNode head;
  3. public DuLinkList(){
  4. head = new DuLNode();
  5. head.prior = head;
  6. head.next = head;
  7. }
  8. public void insert(int i,Object x) throws Exception{
  9. if(i<0 || i>length())
  10. throw new Exception("下标不合法");
  11. DuLNode node = head.next;
  12. int j = 0;
  13. while(!node.equals(head) && j<i){
  14. j++;
  15. node = node.next;
  16. }
  17. DuLNode newNode = new DuLNode(x);
  18. node.prior.next = newNode;
  19. newNode.prior = node.prior;
  20. newNode.next = node;
  21. node.prior = newNode;
  22. }
  23. public void remove(int i) throws Exception{
  24. if(i<0 || i>length()-1)
  25. throw new Exception("下标不合法");
  26. DuLNode node = head.next;
  27. int j = 0;
  28. while(!node.equals(head) && j<i){
  29. j++;
  30. node = node.next;
  31. }
  32. node.prior.next = node.next;
  33. node.next.prior = node.prior;
  34. }
  35. public int length(){
  36. DuLNode node = head.next;
  37. int j = 0;
  38. while(node!=head){
  39. j++;
  40. node = node.next;
  41. }
  42. return j;
  43. }
  44. public void display(){
  45. DuLNode node = head.next;
  46. while(node!=head){
  47. System.out.print(node.data+" ");
  48. node = node.next;
  49. }
  50. }
  51. public Object get(int i) throws Exception{
  52. DuLNode p=head.next;
  53. int j=0;
  54. while(!p.equals(head)&&j<i) {
  55. p=p.next;
  56. ++j;
  57. }
  58. if(j>i||p.equals(head)) {
  59. throw new Exception("第"+i+"个元素不存在");
  60. }
  61. return p.data;
  62. }
  63. public int indexOf(Object x) {
  64. DuLNode p = head.next;
  65. int j=0;
  66. while(p!=head&&!p.data.equals(x)) {
  67. p=p.next;
  68. ++j;
  69. }
  70. if(p!=head)
  71. return j;
  72. else
  73. return -1;
  74. }
  75. public void reverse() {
  76. DuLNode p=head.next;
  77. while(!p.equals(head)) {
  78. DuLNode q=p;
  79. DuLNode r=p.next;
  80. q.next=q.prior;
  81. q.prior=r;
  82. p=p.prior;
  83. }
  84. DuLNode s=head.prior;
  85. head.prior=head.next;
  86. head.next=s;
  87. }
  88. }
  1. public class DuLNode {
  2. public Object data;
  3. public DuLNode prior;
  4. public DuLNode next;
  5. public DuLNode(){
  6. this(null);
  7. }
  8. public DuLNode(Object data){
  9. this.data=data;
  10. this.prior=null;
  11. this.next=null;
  12. }
  13. }
  1. import java.util.Scanner;
  2. public class Test {
  3. public static void main(String[] args) {
  4. Scanner sc = new Scanner(System.in);
  5. System.out.print("输入双向循环链表的长度:");
  6. int n = sc.nextInt();
  7. //1. 建立一个空表
  8. DuLinkList list = new DuLinkList();
  9. //头插法
  10. System.out.print("依次输入双向循环链表的值:");
  11. for (int i = 0; i < n; i++) {
  12. try {
  13. list.insert(0, sc.next());
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. }
  17. }
  18. System.out.print("双向循环链表各元素的值为:");
  19. list.display();
  20. System.out.println();
  21. boolean flag=true;
  22. while (flag) {
  23. System.out.println("输入编号执行相关程序:");
  24. System.out.println("2.在第i个位置插入新的元素x。");
  25. System.out.println("3.删除第i个位置上的元素。");
  26. System.out.println("4.取第i个位置上的元素。");
  27. System.out.println("5.返回元素x第一次出现在双向循环链表中的位置号。");
  28. System.out.println("6.求双向循环链表的长度,即元素个数。");
  29. System.out.println("7.输出双向循环链表中所有的元素值。");
  30. System.out.println("8.实现双向循环链表的就地逆置。");
  31. System.out.println("输入想要执行程序的编号");
  32. Scanner num = new Scanner(System.in);
  33. int z = num.nextInt();
  34. switch (z) {
  35. case 2:
  36. //2. 在第i个位置插入新的元素x
  37. System.out.print("在双向循环链表第i个位置插入新的元素x,依次输入i和x:");
  38. int a = sc.nextInt();
  39. Object b = sc.next();
  40. try {
  41. list.insert(a, b);
  42. } catch (Exception e) {
  43. e.printStackTrace();
  44. }
  45. System.out.print("在第" + a + "个位置插入新的元素" + b + "后的双向循环链表:");
  46. list.display();
  47. System.out.println();
  48. break;
  49. case 3:
  50. //3. 删除第i个位置上的元素
  51. System.out.print("删除双向循环链表第i个位置上的元素,输入i:");
  52. int c = sc.nextInt();
  53. try {
  54. list.remove(c);
  55. } catch (Exception e) {
  56. e.printStackTrace();
  57. }
  58. System.out.print("删除位置" + c + "后的双向循环链表:");
  59. list.display();
  60. System.out.println();
  61. break;
  62. case 4:
  63. //4. 取第i个位置上的元素
  64. System.out.print("输入要查找的位置i:");
  65. int d = sc.nextInt();
  66. try {
  67. System.out.println("第i个位置上的元素为:" + list.get(d));
  68. } catch (Exception e) {
  69. e.printStackTrace();
  70. }
  71. break;
  72. case 5:
  73. //5. 返回元素x第一次出现在双向循环链表中的位置号
  74. System.out.print("返回元素x第一次出现在双向循环链表中的位置号,输入x:");
  75. Object e = sc.next();
  76. System.out.println("元素x第一次出现在双向循环链表中的位置号为:" + list.indexOf(e));
  77. break;
  78. case 6:
  79. //6. 求双向循环链表的长度,即元素个数
  80. System.out.println("双向循环链表的长度,即元素个数:" + list.length());
  81. break;
  82. case 7:
  83. //7. 输出双向循环链表中所有的元素值
  84. System.out.print("输出双向循环链表中所有的元素值:");
  85. list.display();
  86. System.out.println();
  87. break;
  88. case 8:
  89. //8. 实现双向循环链表的就地逆置
  90. System.out.print("双向循环链表的就地逆置:");
  91. list.reverse();
  92. list.display();
  93. System.out.println();
  94. break;
  95. default:
  96. System.out.println("输入错误");
  97. }
  98. System.out.println("上一个程序执行完成!输入1继续选择,输入其他则程序结束");
  99. int x=sc.nextInt();
  100. if (x==1){
  101. flag=true;
  102. }
  103. else {
  104. flag=false;
  105. }
  106. }
  107. }
  108. }

六、测试结果

测试数据:

博主已经测试过所有情况了,由于结果太多这里就放三条结果了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/456435
推荐阅读
相关标签
  

闽ICP备14008679号