• 双向链表的查找、插入和删除


    双向链表的查找

    1. #include
    2. #include
    3. typedef int data_t;
    4. typedef struct node{
    5. data_t data;
    6. struct node *prior;
    7. struct node *next;
    8. }dlistnode;
    9. dlistnode* dlist_create(){
    10. dlistnode *H,*r,*p;
    11. int n;
    12. if((H=(dlistnode *)malloc(sizeof(dlistnode)))==NULL)
    13. {
    14. puts("malloc failed");
    15. return NULL;
    16. }
    17. H->prior = H;
    18. H->next = H;
    19. r = H;
    20. while(1){
    21. printf("please input(-1 exit):");
    22. scanf("%d",&n);
    23. if(n==-1)
    24. break;
    25. if((p=(dlistnode *)malloc(sizeof(dlistnode)))==NULL)
    26. {
    27. printf("malloc failed\n");
    28. return NULL;
    29. }
    30. p->data=n;
    31. p->prior=r;
    32. p->next=r->next;
    33. r->next=p;
    34. H->prior=p;
    35. r=p;
    36. }
    37. return H;
    38. }
    39. void dlist_show(dlistnode* H)
    40. {
    41. dlistnode *p;
    42. p=H->next;
    43. while(p!=H)
    44. {
    45. printf("%d ",p->data);
    46. p=p->next;
    47. }
    48. putchar(10);
    49. }
    50. dlistnode* dlist_get(dlistnode *H,int pos)
    51. {
    52. int i=0;
    53. dlistnode *p=H;
    54. if(pos <0){
    55. puts("pos < 0,invalid!");
    56. return NULL;
    57. }
    58. while(i
    59. p=p->next;
    60. i++;
    61. if(p==H){
    62. puts("pos > length,invalid");
    63. return NULL;
    64. }
    65. }
    66. return p;
    67. }
    68. int main(int argc, const char *argv[])
    69. {
    70. dlistnode *H,*p;
    71. int pos;
    72. H=dlist_create();
    73. dlist_show(H);
    74. while(1)
    75. {
    76. printf("input pos(-1 exit):");
    77. scanf("%d",&pos);
    78. if(pos==-1)
    79. break;
    80. p=dlist_get(H,pos);
    81. if(p)
    82. printf("%d\n",p->data);
    83. }
    84. return 0;
    85. }

    双向链表的插入

    从指定节点前面插入数据

    1. #include
    2. #include
    3. typedef int data_t;
    4. typedef struct node{
    5. data_t data;
    6. struct node *prior;
    7. struct node *next;
    8. }dlistnode;
    9. dlistnode* dlist_create(){
    10. dlistnode *H,*r,*p;
    11. int n;
    12. if((H=(dlistnode *)malloc(sizeof(dlistnode)))==NULL)
    13. {
    14. puts("malloc failed");
    15. return NULL;
    16. }
    17. H->prior = H;
    18. H->next = H;
    19. r = H;
    20. while(1){
    21. printf("please input(-1 exit):");
    22. scanf("%d",&n);
    23. if(n==-1)
    24. break;
    25. if((p=(dlistnode *)malloc(sizeof(dlistnode)))==NULL)
    26. {
    27. printf("malloc failed\n");
    28. return NULL;
    29. }
    30. p->data=n;
    31. p->prior=r;
    32. p->next=r->next;
    33. r->next=p;
    34. H->prior=p;
    35. r=p;
    36. }
    37. return H;
    38. }
    39. void dlist_show(dlistnode* H)
    40. {
    41. dlistnode *p;
    42. p=H->next;
    43. while(p!=H)
    44. {
    45. printf("%d ",p->data);
    46. p=p->next;
    47. }
    48. putchar(10);
    49. }
    50. dlistnode* dlist_get(dlistnode *H,int pos)
    51. {
    52. int i=0;
    53. dlistnode *p=H;
    54. if(pos <0){
    55. puts("pos < 0,invalid!");
    56. return NULL;
    57. }
    58. while(i
    59. p=p->next;
    60. i++;
    61. if(p==H){
    62. puts("pos > length,invalid");
    63. return NULL;
    64. }
    65. }
    66. return p;
    67. }
    68. int dlist_insert(dlistnode *H,data_t value,int pos)
    69. {
    70. dlistnode *p,*q;
    71. p=dlist_get(H,pos);
    72. if(p==NULL)
    73. return -1;
    74. if((q=(dlistnode *)malloc(sizeof(dlistnode)))==NULL)
    75. {
    76. printf("malloc failed\n");
    77. return -1;
    78. }
    79. q->data = value;
    80. q->prior=p->prior;
    81. q->next=p;
    82. p->prior->next=q;
    83. p->prior = q;
    84. return 0;
    85. }
    86. int main(int argc, const char *argv[])
    87. {
    88. dlistnode *H;
    89. int pos;
    90. data_t data;
    91. H=dlist_create();
    92. dlist_show(H);
    93. while(1)
    94. {
    95. printf("input pos(-1 exit):");
    96. scanf("%d",&pos);
    97. if(pos==-1)
    98. break;
    99. printf("input data:");
    100. scanf("%d",&data);
    101. dlist_insert(H,data,pos);
    102. }
    103. dlist_show(H);
    104. return 0;
    105. }

    双向链表的删除

    1. #include
    2. #include
    3. typedef int data_t;
    4. typedef struct node{
    5. data_t data;
    6. struct node *prior;
    7. struct node *next;
    8. }dlistnode;
    9. dlistnode* dlist_create(){
    10. dlistnode *H,*r,*p;
    11. int n;
    12. if((H=(dlistnode *)malloc(sizeof(dlistnode)))==NULL)
    13. {
    14. puts("malloc failed");
    15. return NULL;
    16. }
    17. H->prior = H;
    18. H->next = H;
    19. r = H;
    20. while(1){
    21. printf("please input(-1 exit):");
    22. scanf("%d",&n);
    23. if(n==-1)
    24. break;
    25. if((p=(dlistnode *)malloc(sizeof(dlistnode)))==NULL)
    26. {
    27. printf("malloc failed\n");
    28. return NULL;
    29. }
    30. p->data=n;
    31. p->prior=r;
    32. p->next=r->next;
    33. r->next=p;
    34. H->prior=p;
    35. r=p;
    36. }
    37. return H;
    38. }
    39. void dlist_show(dlistnode* H)
    40. {
    41. dlistnode *p;
    42. p=H->next;
    43. while(p!=H)
    44. {
    45. printf("%d ",p->data);
    46. p=p->next;
    47. }
    48. putchar(10);
    49. }
    50. dlistnode* dlist_get(dlistnode *H,int pos)
    51. {
    52. int i=0;
    53. dlistnode *p=H;
    54. if(pos <0){
    55. puts("pos < 0,invalid!");
    56. return NULL;
    57. }
    58. while(i
    59. p=p->next;
    60. i++;
    61. if(p==H){
    62. puts("pos > length,invalid");
    63. return NULL;
    64. }
    65. }
    66. return p;
    67. }
    68. int dlist_delete(dlistnode *H,int pos)
    69. {
    70. dlistnode *p;
    71. p=dlist_get(H,pos);
    72. if(p==NULL)
    73. return -1;
    74. p->prior->next = p->next;
    75. p->next->prior = p->prior;
    76. free(p);
    77. p=NULL;
    78. return 0;
    79. }
    80. int main(int argc, const char *argv[])
    81. {
    82. dlistnode *H;
    83. int pos;
    84. H=dlist_create();
    85. dlist_show(H);
    86. while(1)
    87. {
    88. printf("input pos(-1 exit):");
    89. scanf("%d",&pos);
    90. if(pos==-1)
    91. break;
    92. dlist_delete(H,pos);
    93. }
    94. dlist_show(H);
    95. return 0;
    96. }

  • 相关阅读:
    JavaScript高级
    ASEMI代理艾赛斯IXFK32N100P,车规级MOS管IXFK32N100P
    c++类型转换和异常
    P8 服务拆分-服务远程调用
    Android12开发之窗口模糊功能的实现
    MySQL事务隔离级别详解
    我的两周年创作纪念日
    linux常见命令(十二)
    【JVM技术专题】GC问题分析和故障排查规划指南「实战篇」
    flask创建的http服务支持跨域CORS的处理
  • 原文地址:https://blog.csdn.net/m0_74712453/article/details/132943679