循环链表【L代表头指针】(百度百科)

  • 链表

    • 循环链表

      • 自定义特征的元素的集合

        • 预定义

          • #include <stdio.h>
            
            #include <stdlib.h>
            
            
            
            #define Status int
            
            #define TRUE 1
            
            #define FALSE 0
            
            #define OK 1
            
            #define ERROR 0
            
            #define OVERFLOW 0

        • 集合

          • 元素

            • 元素项

              • typedef int ElemType;

            • struct LNode{
              
                   ElemType data;
              
                   struct LNode *next;
              
              };

          • typedef struct LNode *LinkList

      • 自定义的一系列操作

        • initList初始化表为其分配指针开辟内存

          • void InitList(LinkList *L) {
            
                /* 操作结果:构造一个空的线性表L */
            
                *L=(LinkList)malloc(sizeof(struct LNode));
            
                /* 产生头结点,并使L指向此头结点 */
            
                if(!*L)
            
                    /* 存储分配失败 */
            
                    exit(OVERFLOW);
            
                (*L)->next=*L;
            
                /* 指针域指向头结点 */
            
            }

        • 遍历

          • 遍历指针不看值

            • 专门计数的

              • 判空

                • 判断头指针是否指向自己

                • Status ListEmpty(LinkList L) {
                  
                      /* 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
                  
                      if(L->next==L)
                  
                          /* 空 */
                  
                          return TRUE;
                  
                      else
                  
                          return FALSE;
                  
                  }

              • 计总数

                • 定位到最后一个元素指针域为头指针,返回辅助计数变量的值

                • int ListLength(LinkList L) {
                  
                      /* 初始条件:L已存在。操作结果:返回L中数据元素个数 */
                  
                      int i=0;
                  
                      LinkList p=L->next;
                  
                      /* p指向头结点 */
                  
                      while(p!=L)
                  
                      /* 没到表尾 */ {
                  
                          i++;
                  
                          p=p->next;
                  
                      }
                  
                      return i;
                  
                  }

            • 遍历同时释放指针

              • 废除表

              • void DestroyList(LinkList *L) {
                
                    /* 操作结果:销毁线性表L */
                
                    LinkList q,p=(*L)->next;
                
                    /* p指向头结点 */
                
                    while(p!=*L) {
                
                        /* 没到表尾 */
                
                        q=p->next;
                
                        free(p);
                
                        p=q;
                
                    }
                
                    free(*L);
                
                    *L=NULL;
                
                }

            • 不看值不计数

              • 插入分配指针的节点并赋值

                • 头插法(没什么新意)

                • 尾插法(借鸡生蛋、鸠占鹊巢法)

          • 遍历指针看值

            • 只看值不计数

              • 通过vi()函数访问所有节点

                • void ListTraverse(LinkList L,void(*vi)(ElemType)) {
                  
                      /* 初始条件:L已存在。操作结果:依次对L的每个数据元素调用函数vi() */
                  
                      LinkList p=L->next->next;
                  
                      /* p指向首元结点 */
                  
                      while(p!=L->next) {
                  
                          /* p不指向头结点 */
                  
                          vi(p->data);
                  
                          p=p->next;
                  
                      }
                  
                      printf("\n");
                  
                  }

              • 清空所有节点,恢复初始化状态

                • void ClearList(LinkList *L)
                  
                  /* 改变L */ {
                  
                      /* 初始条件:线性表L已存在。操作结果:将L重置为空表 */
                  
                      LinkList p,q;
                  
                      *L=(*L)->next;
                  
                      /* L指向头结点 */
                  
                      p=(*L)->next;
                  
                      /* p指向第一个结点 */
                  
                      while(p!=*L)
                  
                      /* 没到表尾 */ {
                  
                          q=p->next;
                  
                          free(p);
                  
                          p=q;
                  
                      }
                  
                      (*L)->next=*L;
                  
                      /* 头结点指针域指向自身 */
                  
                  }

              • 按元素定位取值

                • 定位非头元素返回前驱

                  • Status PriorElem(LinkList L,ElemType cur_e,ElemType *pre_e) {
                    
                        /* 初始条件:线性表L已存在 */
                    
                        /* 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,*/
                    
                        /* 否则操作失败,pre_e无定义 */
                    
                        LinkList q,p=L->next->next;
                    
                        /* p指向第一个结点 */
                    
                        q=p->next;
                    
                        while(q!=L->next) {
                    
                            /* p没到表尾 */
                    
                            if(q->data==cur_e) {
                    
                                *pre_e=p->data;
                    
                                return TRUE;
                    
                            }
                    
                            p=q;
                    
                            q=q->next;
                    
                        }
                    
                        return FALSE;
                    
                        /* 操作失败 */
                    
                    }

                • 定位非尾元素返回后继

                  • Status NextElem(LinkList L,ElemType cur_e,ElemType *next_e) {
                    
                        /* 初始条件:线性表L已存在 */
                    
                        /* 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,*/
                    
                        /* 否则操作失败,next_e无定义 */
                    
                        LinkList p=L->next->next;
                    
                        /* p指向第一个结点 */
                    
                        while(p!=L) {
                    
                            /* p没到表尾 */
                    
                            if(p->data==cur_e) {
                    
                                *next_e=p->next->data;
                    
                                return TRUE;
                    
                            }
                    
                            p=p->next;
                    
                        }
                    
                        return FALSE;
                    
                        /* 操作失败 */
                    
                    }

            • 看值还得计数

              • 只看不改

                • 定位元素位序

                  • int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType)) {
                    
                        /* 初始条件:线性表L已存在,compare()是数据元素判定函数 */
                    
                        /* 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。*/
                    
                        /* 若这样的数据元素不存在,则返回值为0 */
                    
                        int i=0;
                    
                        LinkList p=L->next->next;
                    
                        /* p指向第一个结点 */
                    
                        while(p!=L->next) {
                    
                            i++;
                    
                            if(compare(p->data,e))
                    
                                /* 满足关系 */
                    
                                return i;
                    
                                p=p->next;
                    
                        }
                    
                        return 0;
                    
                    }

                • 定位指定位序上的元素取值

                  • 获取指定节点上的值

                  • Status GetElem(LinkList L,int i,ElemType *e) {
                    
                        /* 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */
                    
                        int j=1;
                    
                        /* 初始化,j为计数器 */
                    
                        LinkList p=L->next->next;
                    
                        /* p指向第一个结点 */
                    
                        if(i<=0||i>ListLength(L))
                    
                            /* 第i个元素不存在 */
                    
                            return ERROR;
                    
                        while(j< i) {
                    
                            /* 顺指针向后查找,直到p指向第i个元素 */
                    
                            p=p->next;
                    
                            j++;
                    
                        }
                    
                        *e=p->data;
                    
                        /* 取第i个元素 */
                    
                        return OK;
                    
                    }

              • 还得看还得改

                • 按位序插入分配指针的节点并赋值

                  • 插入节点

                  • Status ListInsert(LinkList *L,int i,ElemType e) {
                    
                        /* 改变L */
                    
                        /* 在L的第i个位置之前插入元素e */
                    
                        LinkList p=(*L)->next,s;
                    
                        /* p指向头结点 */
                    
                        int j=0;
                    
                        if(i<=0||i>ListLength(*L)+1)
                    
                            /* 无法在第i个元素之前插入 */
                    
                            return ERROR;
                    
                        while(j< i-1) {
                    
                            /* 寻找第i-1个结点 */
                    
                            p=p->next;
                    
                            j++;
                    
                        }
                    
                        s=(LinkList)malloc(sizeof(struct LNode));
                    
                        /* 生成新结点 */
                    
                        s->data=e;
                    
                        /* 插入L中 */
                    
                        s->next=p->next;
                    
                        p->next=s;
                    
                        if(p==*L)
                    
                            /* 改变尾结点 */
                    
                            *L=s;
                    
                        return OK;
                    
                    }

                • 按位序取值并释放指针

                  • 删除节点

                  • Status ListDelete(LinkList *L,int i,ElemType *e) {
                    
                        /* 改变L */
                    
                        /* 删除L的第i个元素,并由e返回其值 */
                    
                        LinkList p=(*L)->next,q;
                    
                        /* p指向头结点 */
                    
                        int j=0;
                    
                        if(i<=0||i>ListLength(*L))
                    
                            /* 第i个元素不存在 */
                    
                            return ERROR;
                    
                        while(j< i-1) {
                    
                            /* 寻找第i-1个结点 */
                    
                            p=p->next;
                    
                            j++;
                    
                        }
                    
                        q=p->next;
                    
                        /* q指向待删除结点 */
                    
                        p->next=q->next;
                    
                        *e=q->data;
                    
                        if(*L==q)
                    
                            /* 删除的是表尾元素 */
                    
                            *L=p;
                    
                        free(q);
                    
                        /* 释放待删除结点 */
                    
                        return OK;
                    
                    }

              • 不看就改

                • 按位序赋值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值