zoukankan      html  css  js  c++  java
  • 循环单链表的结构和定义

    #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。

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

  • 相关阅读:
    Objective-C 在Categroy中创建属性(Property)
    iOS截屏
    iOS简易图片选择器 (图片可多选,仿微信)
    iOS 3D touch 使用技巧
    soap request by afnetworking2.X/3.X
    类似网易新闻 title栏 滚动时 文字放大&变色
    iOS 用collectionview 做的无限图片滚动 广告banner适用
    iOS WebP转换工具
    微博app中常用正则表达式
    python中property(lambda self: object())简单解释
  • 原文地址:https://www.cnblogs.com/lbangel/p/3289215.html
Copyright © 2011-2022 走看看