线性表之循环单链表

#include<iostream>
using namespace std;
struct LinkNode
{
   int value;
   LinkNode* next;
};
LinkNode* createRoundLinkList()
{
    LinkNode* head = (LinkNode*)malloc(sizeof(LinkNode));
    head->next=head;
    head->value=0;
    return head;
}

bool insertElem(int pos,int value,LinkNode* head)
{
    if(pos<=0)return 0;
    LinkNode* p = head;
    int j=0;
    while(p->next!=head && j<pos-1)//定位到pos-1的元素,也就是待插入元素的前一个元素
    {                               //这里和非循环的单链表比起思想 有变化, 写法也有变化
         p=p->next;
         j++;
    }
    if(j==pos-1)
    {
        LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
        newNode->value=value;
        newNode->next=p->next;
        p->next=newNode;
        head->value++;
        return 1;
    }
    return 0;
}
bool deleElem(int pos,LinkNode* head)
{
    if(pos<=0)return 0;
    LinkNode* p = head;
    int j=0;
    while(p->next!=head && j<pos-1)
    {
        p=p->next;
        j++;
    }
    if(p->next!=head)//限制删除元素的位置是 【1,链表长度】这个闭区间,这里和非循环的单链表比起思想没有变化,但写法有变化
    {
        LinkNode* q = p->next;
        p->next=q->next;
        delete(q);
        head->value--;
        return 1;
    }
    return 0;
}
void clearLinkList(LinkNode* head)
{
    LinkNode*p = head->next;
    while(p!=head)//这里和非循环的单链表比起思想没有变化,但写法有变化
    {
        LinkNode*q=p->next;
        deleElem(1,head);//每次删除第一个,逐个删除
        p=q;
    }
}

void destroyLinkList(LinkNode* head)
{
   clearLinkList(head);
   delete head;
   head = 0;
}

void outPut(LinkNode* head)
{
    if(head == NULL)
    {
       cout<<"link list dose not exist"<<endl;
       return;
    }
    if(head->value==0)
    {
        cout<<"link list is empty"<<endl;
        return;
    }
    LinkNode* p = head->next;
    while(p!=head)
    {
         cout<<p->value<<" ";
         p=p->next;
    }
    cout<<endl;
}

void main()
{
    int len=12;
    LinkNode* L= createRoundLinkList();
    int v;
    for(int i=0;i<len;i++)
    {
         v = rand() % 100;
         cout<<v<<" ";
         insertElem(1,v,L);//每次在链表尾部插入,使得输入的顺序和链表中的顺序相反
    }
    cout<<endl;
    outPut(L);
    destroyLinkList(L);
   //outPut(L);
    L= createRoundLinkList();
    for(int i=0;i<len;i++)
    {
         v = rand() % 100;
         cout<<v<<" ";
         insertElem(L->value+1,v,L);//每次在链表尾部插入,使得输入的顺序和链表中的顺序一致

    }
    cout<<endl;
    outPut(L);
    insertElem(3,999,L);
    outPut(L);
    insertElem(100,999,L);
    outPut(L);
    insertElem(L->value,9999,L);
    outPut(L);
    insertElem(L->value+1,8888,L);
    outPut(L);
    insertElem(1,7777,L);
    outPut(L);
    deleElem(1,L);
    outPut(L);
    deleElem(100,L);
    outPut(L);
    deleElem(7,L);
    outPut(L);
    deleElem(L->value,L);
    outPut(L);
    deleElem(L->value+1,L);
    outPut(L);
    clearLinkList(L);
    outPut(L);
    cin>>len;
}
时间: 2024-10-14 09:59:46

线性表之循环单链表的相关文章

小猪的数据结构辅助教程——2.2 线性表中的单链表

小猪的数据结构辅助教程--2.2 线性表中的单链表 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点: 1.理解顺序表以及单链表各自的有点以及缺点! 2.熟悉单链表的形式,对于头指针,头结点,尾结点,数据域和指针域这些名词要知道是什么! 3.熟悉单链表的结点结构 4.区分头指针与头结点! 5.熟悉创建单链表的两种方式:头插法和尾插法 6.了解单链表12个基本操作的逻辑 7.有趣的算法题:查找单链表的中间结点~ 1.单链表的引入(顺序表与单链表的PK) 2.单链表的结构图以及一些名

线性表之循环双链表

#include<iostream> using namespace std; struct LinkNode { int value; LinkNode* next; LinkNode* pre; }; LinkNode* createDoubleRoundLinkList() { LinkNode* head = (LinkNode*)malloc(sizeof(LinkNode)); head->next=head; head->pre=head; head->valu

线性表总结(单链表的反转)

主要总结单链表反转的几种方法 第一种方法貌似是递归,不太懂,第二种方法使用三个指针逐一完成逆置 结构体定义:class ListNode { int val; ListNode next; ListNode(int x) { //这步没看懂,是结构体里引用了自己吗 val = x; next = null; } } 1 // 1.就地反转法 2 public ListNode reverseList1(ListNode head) { 3 if (head == null) 4 return h

【线性表5】线性表的链式实现:循环单链表

简介 循环单链表 是在在单链表的基础上,用最后的一个结点的指针域指向头结点形成的.因此它在逻辑上是一个环形结构. 循环单链表在实际编程中很少用. 要点:1.遍历结束的标志是 p == [头结点地址],而不是p==NULL 2.表为空的判断标志是:   if( head->next == head   ) 3.在单循环链表中,从任一结点出发都可访问到表中所有结点 循环链表一般还使用尾指针rear保存最后一个结点的地址,因为使用尾指针既可以快速找到 最后一个结点,也可以快速找到头结点. 简单的代码实

02循环单链表

循环单链表定义:将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成了 一个环,这种头尾相接的单链表成为单循环链表. 循环链表的数据结构: 1 /* c2-2.h 线性表的单链表存储结构 */ 2 struct LNode 3 { 4 ElemType data; 5 struct LNode *next; 6 }; 7 typedef struct LNode *LinkList; /* 另一种定义LinkList的方法 */ 代码实现: 1 2 3 /* bo2-4.c 设立

数据结构&gt;&gt;线性表【注意】--&gt;链表求A-B(原A与B都递增,求完的A-B不改变A原来的顺序)

/*关于链表的题目 * A.B是两个递增有序的单链表,元素个数分别是m和n,求 * 集合A-B,并将结果保存在A中,且仍然保持递增有序. * converge_ab */ #include <iostream.h> using namespace std; typedef struct lnode{ int data; struct lnode * next; }lnode; int main(){ lnode * create_chain(int num,int interval,int s

数据结构之自建算法库——循环单链表

本文针对数据结构基础系列网络课程(2):线性表中第13课时双链表. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 双链表算法库算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:clinklist.h,包含定义双链表数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef CLINKLIST_H_INCLUDED #define CLINKLIST_H_INCLUDED //循环单链表基本运算函数 typedef int ElemT

_DataStructure_C_Impl:循环单链表

//CycList:循环单链表 #include<stdio.h> #include<stdlib.h> typedef int DataType; typedef struct Node{ DataType data; struct Node *next; }ListNode,*LinkList; //创建一个不带头结点的循环单链表 LinkList CreateCycList(int n){ DataType e; LinkList head=NULL; ListNode *p

【C语言数据结构】循环单链表

CircleLinkList.h #ifndef CIRCLE_LINK_LIST #define CIRCLE_LINK_LIST //链表节点 typedef struct _CircleLinkListNode {     struct _CircleLinkListNode *next; }CircleLinkListNode; //循环单链表 typedef void CircleLinkList; /*  * 创建循环单链表  * @return 返回循环单链表的指针  */ Cir