跳转至

循环链表

定义

将链表通过指针域首尾相接,即链表尾结点的指针域指向头结点形成的链表叫做循环链表。

由单链表构成叫做单循环链表。

单循环链表在任意一结点都可以访问其他节点,用指针是否为null判断是否到达链表尾。一般使用尾结点的指针来表示, 提高效率。

代码

循环链表操作:(由两个单链表构成循环链表,其中保留一个头结点作为尾结点) - Length(L) 返回表L的长度,即表中元素个数 - Prior(L,i) 取位置i的前驱元素 - Next(L,i) 取位置i的后继元素 - Locate(L,x) 这是一个函数,函数值为元素x在L中的位置 - Insert(L,i,x)在表L的位置i处插入元素x,将原占据位置i的元素及后面的元素都向后推一个位置 - Delete(L,p) 从表L中删除位置p处的元素 - Get(L,i) 这是一个函数,函数值为L中位置i处的元素(1≤i≤n) - IsEmpty(L) 如果表L为空表(长度为0)则返回true,否则返回false - Clear(L)清除所有元素 - Traverse(L)遍历输出所有元素 - Update(L,i,x)修改元素 - 退出 - 清空命令行! - 创建循环链表

#include<iostream>
#include<cstdlib>
#include<malloc.h>
using namespace std;
typedef int dataType;
typedef struct Node{
    dataType data=-1;
    struct Node *next;
}LNode,*LinkedList;
//创建链表  
LinkedList linkedListCreateT() {
    int i = 1;
    LinkedList l = (LNode*)malloc(sizeof(LNode));
    LinkedList p;
    l->next = NULL;
    while (i != 21) {
        p = (LNode*)malloc(sizeof(LNode));
        p->data = i;
        ++i;
        p->next = l->next;
        l->next = p;
    }
    return l;
}
LinkedList create() {
    LinkedList p = linkedListCreateT();
    LinkedList l = linkedListCreateT();
    LinkedList lb = l;
    LinkedList pb = p->next;
    while (l->next != NULL) {
        l = l->next;
    }
    LinkedList le = l;
    le->next = pb;
    free(p);
    while (pb->next != NULL) {
        pb = pb->next;
    }
    LinkedList pe = pb;
    pe->next = lb;
    cout << "循环链表创建成功" << endl;
    return lb;
}
//表中元素个数
int  linkedListLength(LinkedList l) {
    int i=0;
    LinkedList p=l;
    p = p->next;
    while (p!=l) {
        i++;
        p=p->next;
    }
    return i+1;
}
//函数值为L中位置i处的元素
void linkedListGet(LinkedList l,int i) {
        int j = 0;
        LinkedList p=l; 
        while (j!=i) {
            ++j;
            p = p->next;
        }
        cout << i << "位置的元素是:" << p->data << endl; 
}
//取位置i的前驱元素
void linkedListPrior(LinkedList l, int i) {
        int j = 0;
        LinkedList p=l;
        while(j!=i-1) {
                ++j;
                p = p->next;
        }
        if (p==l) {
            cout << "位置:" << i << "的前驱元素为:尾结点" << endl;
        }
        else cout << "位置:" << i << "的前驱元素为:" << p->data << endl;
}
//取位置i的后继元素
void linkedListNext(LinkedList l, int i) {
        int j = 0;
        LinkedList p=l;
        while(j!=i+1) {         
            ++j;
            p = p->next;            
        }
        if (p == l){
            cout << "位置" << i << "的后驱是:尾结点"<< endl;
        }
        else cout << "位置" << i << "的后驱是:" << p->data << endl;
}
//元素x在L中的位置
void linkedListLocate(LinkedList l, dataType x) {
    int i = 0,flag=0;
    LinkedList p=l;
    while(i!=linkedListLength(l)){
            ++i;
            if (p->data == x) {
                cout << x << "在表中的位置是:" << i << endl;
                flag++;
            }
            p = p->next;    
    }
    if(flag==0) cout<<"不在表中"<<endl;
}
//在表L的位置i处插入元素x
LinkedList linkedListInsert(LinkedList l,int i,dataType x) {
    int j = 0;
    LinkedList pri=l,s=l;
    LinkedList p = (LNode*)malloc(sizeof(LNode));
    p->data = x;
    while (j != i) {
        ++j;
        pri = s;
        s = s->next;
    }
    pri->next = p;
    p->next = s;
    cout << "插入成功!" << endl;
    return l;
}
//删除位置i处的元素
LinkedList linkedListDelete(LinkedList l,int i) {
    int j = 0;
    LinkedList pri = l, p = l;
    while(j!=i){
        j++;
        pri = p;
        p = p->next;
    }
    pri->next = p->next;
    free(p);
    cout << "删除成功!" << endl;
    return l;
}
//表是否为空
void linkedListEmpty(LinkedList l) {
    if (l->next==l) {
        cout << "是空表!" << endl;
    }
    else cout << "不是空表!" << endl;
}
//清空表
LinkedList linkedListClear(LinkedList l) {
    LinkedList p=l,pri=l;
    p = p->next;
    while (p!=l) {
        pri = p;
        p = p->next;
        free(pri);
    }
    l->next = l;
    cout << "清空完成!" << endl;
    return l;
}
//遍历输出所有元素
void linkedListTraverse(LinkedList l) {
    LinkedList p=l;
    p=p->next;
    if (p!=l) {
        cout << "遍历结果是:";
        while (p != l) {
                cout << p->data << " ";
                p = p->next;
        }
        cout << endl;
    }else {
        cout << "空表不能遍历!" << endl;
    }
}
//将位置i的元素修改为x
LinkedList sqlListUpdate(LinkedList l,int i,dataType x) {
    LinkedList p=l;
    int j = 0;
    while(j!=i){
        ++j;
        p = p->next;  
    }
    p->data = x;
    cout << "修改成功!" << endl;
    return l;
}
void print() {
    cout << "*********************************************"<<endl;
    cout << "*  1.链表的长度        2.取位置i的前驱     *"<< endl;
    cout << "*  3.取位置i的后驱          4.元素x的位置  *"<< endl;
    cout << "*  5.位置i处插入元素x    6.删除位置i的元素 *"<< endl;
    cout << "*  7.取位置i的元素          8.表是否为空       *"<< endl;
    cout << "*  9.清空表              10.遍历表        *"<< endl;
    cout << "*  11.修改位置i的元素    12.退出             *"<< endl;
    cout << "*  13.清空命令行           14创建循环链表      *"<< endl;
    cout << "*********************************************"<< endl;
}
void main() {
    int m=0,i = 0,n=0;
    LinkedList l = create();
    print();
    while (1) {
        cin >> i;
        switch (i)
        {
        case 1:cout <<"链表的长度为:"<<linkedListLength(l) << endl; break;
        case 2:cin >> m;linkedListPrior(l, m); break;
        case 3:cin >> m; linkedListNext(l, m); break;
        case 4:cin >> m; linkedListLocate(l, m); break;
        case 5:cin >> m >> n;l=linkedListInsert(l, m, n); break;
        case 6:cin >> m;l=linkedListDelete(l, m); break;
        case 7:cin >> m; linkedListGet(l, m);break;
        case 8:linkedListEmpty(l);break;
        case 9:l = linkedListClear(l);break;
        case 10:linkedListTraverse(l);break;
        case 11:cin >> m; cin >> n;l = sqlListUpdate(l,m,n); break;
        case 12:exit(0);
        case 13:system("cls"); print();break;
        case 14:l = create(); break;
        default:cout << "数字超出范围,请重新输入。" << endl; break;
        }
    }
}


本文总阅读量本站访客数人次