当前位置:   article > 正文

数据结构(Java随笔)—链表_链表里的数据能动态开辟空间吗

链表里的数据能动态开辟空间吗

链表结构是一种动态存储分配的结构形式,可以根据需要动态申请所需的内存单元

链表中每个结点都应包括如下两个部分:

  • 数据部分,保存的是该结点的实际数据。
  • 地址部分,保存的是下一个结点的地址。

链表(linked list)|(chain table)结构就是由许多这种结点构成,在进行链表操作时,首先要定义一个“头引用”变量(一般以head表示),该引用变量指向链表结构的第一个结点,第一个结点的地址部分又指向下一个结点......直到最后一个结点不再指向其他结点,称为“表尾”,一般在表尾的地址部分放一个空地址“null”,链表结束。

链表结构的优点:适合于插入,删除操作较多的数据结构,结点之间不要求连续存放,动态分配结点的存储空间,当需要删除某个结点时,给该结点赋值“null”就可以释放其占用的内存空间。

链表结构的缺点:不利于查找,追加操作,浪费存储空间,对每一个结点数据,都需要一个额外的保存一个引用变量,对链表的访问,只能从表头“head”开始逐个查找,而不能像顺序表那样进行随机访问。

对链表结构的设计有以下几个步骤:

  1. 定义链表结构(LLType
  2. 初始化链表(LLInit
  3. 计算链表长度(LLLength
  4. 追加数据(LLAdd
  5. 修改结点(LLUpdate
  6. 删除结点(LLDelete
  7. 查找所有节点(LLSelect

代码实现:

一,定义结点

  1. public class Data {//定义结点
  2. String name;
  3. String age;
  4. }

二,设计链表结构

  1. public class LList {
  2. LLType head;//定义全局头引用
  3. class LLType{//定义链表结构
  4. Data data = new Data();
  5. LLType nextNode;
  6. }
  7. void LLInit(){//初始化链表结构
  8. head=null;
  9. }
  10. int LLLength(){//计算链表长度
  11. LLType htemp;
  12. int len=1;
  13. if(head==null){
  14. return 0;
  15. }
  16. htemp=head;
  17. while(htemp.nextNode!=null){//循环至链尾,循环一次链表长度变量len增一
  18. htemp=htemp.nextNode;
  19. len++;
  20. }
  21. return len;
  22. }
  23. int LLAdd(Data d){//追加数据
  24. LLType htemp,node;
  25. if((node=new LLType())==null){//开辟一个新结点来保存追加的数据
  26. return 0;
  27. }else{
  28. node.data=d;
  29. node.nextNode=null;
  30. if(head==null){//是否为空链表
  31. head=node;
  32. return 1;
  33. }
  34. htemp=head;
  35. while(htemp.nextNode!=null){//循环至链尾
  36. htemp=htemp.nextNode;
  37. }
  38. htemp.nextNode=node;//链尾添加新增结点地址
  39. return 1;
  40. }
  41. }
  42. int LLUpdate(String name,Data d){//修改结点(结点位置,结点数据)
  43. LLType pnode,htemp,node;//依次保存前一个结点,当前结点,新结点
  44. if(head==null){//是否为空链表
  45. return 0;
  46. }
  47. if((node=new LLType())==null){//开辟一个新结点来保存追加的数据
  48. return 0;
  49. }else{
  50. node.data=d;
  51. htemp=head;
  52. pnode=head;
  53. do{//遍历至要修改的结点位置
  54. if(htemp.data.name.equals(name)){//找到结点位置后
  55. if(htemp==head){ //是否为链头
  56. node.nextNode=head.nextNode;
  57. head=node;
  58. return 1;}
  59. pnode.nextNode=node;//前一个结点地址引用指向新结点
  60. node.nextNode=htemp.nextNode;//新结点地址引用指向下一结点
  61. return 1;
  62. }//当前结点位置不符合
  63. pnode=htemp;//更新临时结点
  64. htemp=htemp.nextNode;
  65. }while(htemp!=null);
  66. return 0;
  67. }
  68. }
  69. int LLDelete(String name){//删除结点
  70. LLType pnode,htemp;
  71. if(head==null){
  72. return 0;
  73. }
  74. pnode=head;
  75. htemp=head;
  76. do{
  77. if(htemp.data.name.equals(name)){//找到结点位置后
  78. if(htemp==head){ //是否为链头
  79. head=htemp.nextNode;
  80. return 1;}
  81. pnode.nextNode=htemp.nextNode;
  82. return 1;
  83. }//当前结点位置不符合
  84. pnode=htemp;//更新临时结点
  85. htemp=htemp.nextNode;
  86. }while(htemp!=null);
  87. return 0;
  88. }
  89. void LLSelectAll(){//查找所有节点
  90. LLType htemp;
  91. if(head==null){
  92. System.out.println("链表为空");
  93. return;
  94. }
  95. htemp=head;
  96. do{
  97. System.out.println("姓名:"+htemp.data.name+"|年龄:"+htemp.data.age);
  98. htemp=htemp.nextNode;
  99. }while(htemp!=null);
  100. }
  101. }

三,运行测试

  1. public static void main(String[] args) {
  2. Scanner in=new Scanner(System.in);
  3. LList dt=new LList();
  4. dt.LLInit();
  5. while(true){
  6. System.out.println("请输入:0(退出),1(添加信息),2(修改信息),3(查询所有信息),4(删除信息)");
  7. int i=in.nextInt();
  8. switch (i) {
  9. case 0:
  10. return;
  11. case 1:
  12. Data d=new Data();
  13. System.out.print("添加姓名:");
  14. String name=in.next();
  15. System.out.print("添加年龄:");
  16. String age=in.next();
  17. if(name==null||age==null){
  18. System.out.println("信息不能为空");
  19. break;
  20. }
  21. d.age=age;
  22. d.name=name;
  23. int temp1=dt.LLAdd(d);
  24. if(temp1==0){
  25. System.out.println("添加失败");
  26. break;
  27. }System.out.println("添加成功");
  28. break;
  29. case 2:
  30. System.out.print("要修改的姓名:");
  31. String oname=in.next();
  32. Data d2=new Data();
  33. System.out.print("新姓名:");
  34. String name2=in.next();
  35. System.out.print("新年龄:");
  36. String age2=in.next();
  37. if(name2==null||age2==null){
  38. System.out.println("信息不能为空");
  39. break;
  40. }
  41. d2.age=age2;
  42. d2.name=name2;
  43. int temp2=dt.LLUpdate(oname, d2);
  44. if(temp2==0){
  45. System.out.println("修改失败");
  46. break;
  47. }System.out.println("修改成功");
  48. break;
  49. case 3:
  50. dt.LLSelectAll();
  51. break;
  52. case 4:
  53. System.out.print("要删除的姓名:");
  54. String name4=in.next();
  55. if(name4==null){
  56. System.out.println("信息不能为空");
  57. break;
  58. }
  59. int temp4=dt.LLDelete(name4);
  60. if(temp4==0){
  61. System.out.println("删除失败");
  62. break;
  63. }System.out.println("删除成功");
  64. break;
  65. default:
  66. break;
  67. }
  68. }
  69. }

 

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

闽ICP备14008679号