当前位置:   article > 正文

数据结构:单向循环链表

数据结构:单向循环链表

功能:

1.创建头节点

  1. loop_p creat_head(){
  2. loop_p L=(loop_p)malloc(sizeof(loop_list));
  3. if(L==NULL){
  4. printf("空间申请失败\n");
  5. return NULL;
  6. }
  7. L->len=0;
  8. L->next=L;
  9. return L;
  10. }

2.创建节点

  1. //创建节点
  2. loop_p creat_node(int data){
  3. //在堆区申请一个节点的空间
  4. loop_p new=(loop_p)malloc(sizeof(loop_list));
  5. if(new==NULL){
  6. printf("空间申请失败\n");
  7. return NULL;
  8. }
  9. new->data=data;
  10. return new;//返回申请的节点的首地址
  11. }

3.判空

  1. //判空
  2. int loop_empty(loop_p H){
  3. if(H==NULL){
  4. printf("头节点为空\n");
  5. return -1;
  6. }
  7. //如果头节点指向头节点本身说明链表空
  8. return H->next==H?1:0;
  9. }

4.头插

  1. //头插
  2. void insert_head(loop_p H,int data){
  3. if(H==NULL){
  4. printf("头节点为空\n");
  5. return;
  6. }
  7. loop_p new=creat_node(data);
  8. new->next=H->next;
  9. H->next=new;
  10. H->len++;
  11. }

5.尾插

  1. //尾插
  2. void insert_tail(loop_p H,int data){
  3. if(H==NULL){
  4. printf("头节点为空\n");
  5. return;
  6. }
  7. loop_p new=creat_node(data);
  8. loop_p p=H;
  9. while(p->next!=H){
  10. p=p->next;
  11. }
  12. new->next=H;
  13. p->next=new;
  14. H->len++;
  15. }

6.按位置插入

  1. //按位置插入,头节点是第0个节点
  2. void insert_pos(loop_p H,int pos,int data){
  3. if(H==NULL){
  4. printf("头节点为空\n");
  5. return;
  6. }
  7. loop_p p=H;
  8. //判断位置合理性
  9. if(pos<=0 || pos>H->len+1){
  10. printf("位置不合理\n");
  11. return;
  12. }
  13. for(int i=0;i<pos-1;i++){
  14. p=p->next;
  15. }
  16. loop_p new=creat_node(data);
  17. new->next=p->next;
  18. p->next=new;
  19. new->data=data;
  20. H->len++;
  21. }

7.尾删

  1. //尾删
  2. void del_tail(loop_p H){
  3. if(H==NULL){
  4. printf("头节点为空\n");
  5. return;
  6. }
  7. if(loop_empty(H)){
  8. printf("链表为空\n");
  9. return;
  10. }
  11. loop_p p=H;
  12. while(p->next->next!=H)
  13. p=p->next;
  14. loop_p del=p->next;
  15. p->next=p->next->next;
  16. free(del);
  17. H->len--;
  18. }

8.头删

  1. //头删
  2. void del_head(loop_p H){
  3. if(H==NULL){
  4. printf("头节点为空\n");
  5. return;
  6. }
  7. if(loop_empty(H)){
  8. printf("链表为空\n");
  9. return;
  10. }
  11. loop_p p=H;
  12. loop_p del=p->next;
  13. p->next=p->next->next;
  14. free(del);
  15. H->len--;
  16. }

9.按位置删除

  1. //按位置删除
  2. void del_pos(loop_p H,int pos){
  3. if(H==NULL){
  4. printf("头节点为空\n");
  5. return;
  6. }
  7. if(loop_empty(H)){
  8. printf("链表为空\n");
  9. return;
  10. }
  11. //判断位置合理性
  12. if(pos<=0 || pos>H->len+1){
  13. printf("位置不合理\n");
  14. return;
  15. }
  16. loop_p p=H;
  17. for(int i=1;i<pos-1;i++){
  18. p=p->next;
  19. }
  20. loop_p del=p->next;
  21. p->next=p->next->next;
  22. free(del);
  23. H->len--;
  24. }

10.打印列表

  1. //打印列表
  2. void out_put(loop_p H){
  3. if(H==NULL){
  4. printf("头节点为空\n");
  5. return;
  6. }
  7. loop_p p=H->next;
  8. while(p!=H){
  9. printf("%d ",p->data);
  10. p=p->next;
  11. }
  12. putchar(10);
  13. }

11.按值查找,返回在链表中的位置

  1. int search_value(loop_p H,int data){
  2. if(H==NULL){
  3. printf("头节点为空\n");
  4. return -1;
  5. }
  6. loop_p p=H->next;
  7. int i=1;
  8. while(p->next!=H){
  9. if(p->data==data){
  10. return i;
  11. }
  12. p=p->next;
  13. i++;
  14. }
  15. printf("查找失败\n");
  16. }

12.按下标查找,返回数值

  1. int search_pos(loop_p H,int pos){
  2. if(H==NULL){
  3. printf("头节点为空\n");
  4. return -1;
  5. }
  6. //判断位置合理性
  7. if(pos<=0 || pos>H->len){
  8. printf("位置不合理\n");
  9. return -1;
  10. }
  11. loop_p p=H->next;
  12. for(int i=1;i<pos;i++){
  13. p=p->next;
  14. }
  15. return p->data;
  16. }

13.按值修改元素

  1. void updata_value(loop_p H,int data,int new_data){
  2. if(H==NULL){
  3. printf("头节点为空\n");
  4. return;
  5. }
  6. loop_p p=H->next;
  7. while(p!=H){
  8. if(p->data==data)
  9. p->data=new_data;
  10. p=p->next;
  11. }
  12. printf("查找不到该元素\n");
  13. }

14.循环链表逆置

  1. //循环链表逆置
  2. void overturn_loop(loop_p H){
  3. if(H==NULL){
  4. printf("头节点为空\n");
  5. return;
  6. }
  7. if(loop_empty(H)){
  8. printf("链表为空\n");
  9. return;
  10. }
  11. if(H->next->next==H){
  12. printf("只有一个元素,不用逆置\n");
  13. return;
  14. }
  15. loop_p p=H->next->next;
  16. H->next->next=H;
  17. loop_p q=p->next;
  18. while(p!=H){
  19. p->next=H->next;
  20. H->next=p;
  21. p=q;
  22. if(q!=H)
  23. q=q->next;
  24. }
  25. }
  1. #ifndef _LOOP_LIST_H__
  2. #define _LOOP_LIST_H__
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. typedef struct loop_list{
  7. union{
  8. int len;
  9. int data;
  10. };
  11. struct loop_list *next;
  12. }loop_list,*loop_p;
  13. //创建单向循环链表
  14. loop_p creat_head();
  15. //创建节点
  16. loop_p creat_node(int data);
  17. //判空
  18. int loop_empty(loop_p H);
  19. //头插
  20. void insert_head(loop_p H,int data);
  21. //打印列表
  22. void out_put(loop_p H);
  23. //尾插
  24. void insert_tail(loop_p H,int data);
  25. //按位置插入,头节点是第0个节点
  26. void insert_pos(loop_p H,int pos,int data);
  27. //头删
  28. void del_tail(loop_p H);
  29. //尾删
  30. void del_head(loop_p H);
  31. //按位置删除
  32. void del_pos(loop_p H,int data);
  33. //按值查找,返回在链表中的位置
  34. int search_value(loop_p H,int data);
  35. //按下标查找,返回数值
  36. int search_pos(loop_p H,int pos);
  37. //按值修改元素
  38. void updata_value(loop_p H,int data,int new_data);
  39. //循环链表逆置
  40. void overturn_loop(loop_p H);
  41. #endif

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

闽ICP备14008679号