循环单链表的结构和定义

#include  "stdafx.h"
#include<iostream>
using namespace std;
#include<malloc.h>


enum Status{OK,ERROR};

typedef int ElemType;

typedef struct Lnode 
{
    ElemType num;    ///结点元素类型为int
    Lnode *next;    ///指向下一结点的指针
}LNode,*LinkList;

///创建n个人序号的链表
Status CreatLink(LinkList &L,int n)
{
     LinkList p;
     LinkList head;
     L = (LinkList)malloc(sizeof(LNode));///带头结点的链表
     if (L == NULL)
     {
        return ERROR;
     }
     L->next = L; //构成一个循环链表
     head = L;      //使head指向L,后面没创建一个节点时就将它放到head的后面,然后在使head指向它。

     for (int i = 0; i < n; ++i)
     {
          p = (LinkList)malloc(sizeof(LNode));///生成新结点
          if (p == NULL)
          {
                return ERROR;
          }
          p->num = i+1;
          p->next = L;

          head->next = p;///尾插法插入新结点
          head = p;
     }
    return OK;
}

///打印链表
Status PrintLink(LinkList L)
{
     LinkList p = L->next;
     LinkList q;
     while (p != L)
     {
          q = p->next;
          cout<<"    "<<p->num;
          p = q;
     }
     cout<<endl;
    return OK;
}
//删除单链表的第i个位置的元素
void insert(LinkList &L,int i,ElemType &e)
{
    LNode *p;
    int j=1;
    LinkList node;
    p=L;
    while(p->next!=L  && j<i)    //寻找第i-1个节点
    {
        p=p->next;
        ++j;
    }
    if(p->next==L && j<i) //经过上面while的循环,如果超出边界,那么此时p指针已经指向最后一个节点
    {
        cout<<"插入的位置已经超出边界"<<endl;
        return;
    }
    node = (LinkList) malloc(sizeof(LNode));//创建LNode的节点
    node->num=e;
    node->next = p->next;
    p->next = node;
}

///删除符合要求的结点
Status DelLink(LinkList &L,int n)
{
    int i = 1;
    LinkList p,q;
    p=L;
    while(p->next!=L && i<n) //要删除节点n,先找到节点n-1,当条件退出时指针正好指向n-1
    {
        p=p->next;
        ++i;
    }
    if(p->next==L)
    {
        cout<<"没有找到要删除循环单链表的位置:"<<endl;
        return ERROR;
    }
    q = p->next;
    p->next = q->next;
    free(q);
    return OK;
}

//销毁链表
Status DestroyLink(LinkList &L)
{
     LinkList p = L->next;
     LinkList q;
     while (p != L)
     {
          q = p->next;
          free(p);
          p = q;
     }
    free(L);
    return OK;
}



int main(int argc,char* argv[])
{
    int n;
    ElemType data;
    LinkList L;
    cin>>n;
    CreatLink(L,n);
    PrintLink(L);
    cout<<"请输入删除的位置:";
    cin>>n;
    DelLink(L,n);
    cout<<"请输入要插入元素的位置和数据:";
    cin>>n;
    cin>>data;
    insert(L,n,data);
    PrintLink(L);
    cin>>n;
    DestroyLink(L);

     return 0;
}

  对于单链表和循环单链表而言,最大的区别就是循环单链表的最后一个节点指向了头结点,而单链表最后的一个节点为NULL。

  实现时的方法基本一样,唯一不同的是判断条件:

  单链表:空 的判断是最后一个节点指针域为NULL。

  循环单链表:空 的判断是节点的下一个节点指向本身,也就是只有一个头结点。

原文地址:https://www.cnblogs.com/lbangel/p/3289215.html