线性表的链式表示

谁践踏了优雅 2022-07-14 15:52 310阅读 0赞

上篇文章是线性表的顺序表示,本篇便是线性表的链式表示。

主函数的步骤包括,输入线性表数据,对链表的删除,插入。利用指针进行对链表的访问。

同时为了增加程序可读性,将结构体定义为LNode,*linklist。

  1. #include<iostream>
  2. //线性表的链式表示
  3. using namespace std;
  4. typedef struct LNode
  5. {
  6. int data;
  7. struct LNode *next;
  8. }LNode,*linklist;//指向结构体的指针变量
  9. int initlist(linklist &l)//初始化链表
  10. {
  11. l=new LNode;//新的头节点
  12. l->next=NULL;
  13. return 1;//成功初始化
  14. }
  15. int getelem(linklist l,int i,int &e)//链表的取值
  16. {
  17. LNode *p;
  18. p=l->next;
  19. int j=1;
  20. while(p&&i<j)
  21. {
  22. p=p->next;
  23. j++;
  24. }
  25. if(!p||i>=j) return 0;
  26. e=p->data;
  27. return 1;
  28. }
  29. int loateelem(linklist l,int e)//查找
  30. {
  31. linklist p;
  32. int i;
  33. p=l;
  34. while(p)
  35. {
  36. p=p->next;
  37. if (p->data==e)
  38. return 1;
  39. }
  40. if(!p)
  41. return 0;
  42. }
  43. int listinsert(linklist &l,int i,int e)//线性表的插入
  44. {
  45. linklist p,s;
  46. s=new LNode;
  47. int j=0;
  48. p=l;
  49. while(p&&j<(i-1))
  50. {
  51. p=p->next;
  52. j++;
  53. }
  54. if(!p||j>(i-1)) return 0;
  55. s->data=e;
  56. s->next=p->next;
  57. p->next=s;
  58. return 1;
  59. }
  60. int listdelet(linklist &l,int i)//链表的删除
  61. {
  62. linklist p,q;
  63. int j=0;
  64. p=l;
  65. while(p->next && j<(i-1))
  66. {
  67. p=p->next;
  68. j++;
  69. }
  70. if(!(p->next)||j>(i-1)) return 0;
  71. q=p->next;
  72. p->next=p->next->next;
  73. delete q;
  74. return 1;
  75. }
  76. void creatlist(linklist &l,int n)//创建链表
  77. {
  78. l=new LNode;
  79. linklist p;
  80. l->next=NULL;
  81. for(int i=0;i<n;i++)
  82. {
  83. p=new LNode;
  84. cin>>p->data;
  85. p->next=l->next;
  86. l->next=p;
  87. }
  88. }
  89. int main()
  90. {
  91. linklist l,p;
  92. int n,i,j,k;
  93. cin>>n;
  94. initlist(l);//初始化链表
  95. creatlist(l,n);//创建链表
  96. p=l->next;//p指向首元节点
  97. for(i=0;i<n;i++)
  98. {
  99. cout<<p->data<<" ";//输出节点的数据域
  100. p=p->next;//p继续指向下一个节点
  101. }
  102. cout<<endl<<"删除的数据:";//删除链表数据
  103. cin>>k;
  104. if(listdelet(l,k))
  105. {
  106. cout<<"删除成功"<<endl;
  107. p=l->next;
  108. for(i=0;i<n-1;i++)
  109. {
  110. cout<<p->data<<" ";//输出节点的数据域
  111. p=p->next;//p继续指向下一个节点
  112. }
  113. }
  114. else cout<<"删除失败"<<endl;
  115. cout<<endl<<"输入插入的位置与数值:";//插入数据
  116. cin>>j>>k;
  117. if(listinsert(l,j,k));
  118. {
  119. cout<<"插入成功"<<endl;
  120. p=l->next;//p指向首元节点
  121. for(i=0;i<n;i++)
  122. {
  123. cout<<p->data<<" ";//输出节点的数据域
  124. p=p->next;//p继续指向下一个节点
  125. }
  126. }
  127. if(!listinsert(l,j,k)) cout<<"插入失败"<<endl;
  128. return 0;
  129. }

发表评论

表情:
评论列表 (有 0 条评论,310人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线性表示

    上篇文章是线性表的顺序表示,本篇便是线性表的链式表示。 主函数的步骤包括,输入线性表数据,对链表的删除,插入。利用指针进行对链表的访问。 同时为了增加程序可读性,将结构体定

    相关 线性表示

    上篇文章是线性表的顺序表示,本篇便是线性表的链式表示。 主函数的步骤包括,输入线性表数据,对链表的删除,插入。利用指针进行对链表的访问。 同时为了增加程序可读性,将结构体定