资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > C/C++/C#

循环双链表(C语言实现)

C/C++/C# 更新时间: 发布时间: 计算机考试归档 最新发布

循环双链表(C语言实现)

#include
#include
#include 
typedef int DataType;
typedef struct Node
{
    DataType data;            //    数据域 
    struct Node * prior;    //    前趋指针 
    struct Node * next;        //    后继指针 
        
}linkList;

linkList* Init_List();            //    初始化循环双链表 
bool Creat_List(linkList * L);    //    创建链表 
int Length_List(linkList * L);    //    链表长度 
bool Empty_List(linkList * L);    //    判空 
bool Insert_List(linkList * L, int pos, DataType x);//    插入 
bool Delete_List(linkList * L, int pos, DataType * x);//    删除 
bool Destroy_List(linkList * L);    //    销毁链表
bool Traverse_List(linkList * L);    // 遍历链表 
int Prior_Value(linkList * L, int pos); //    前趋结点的值 

int main()
{
    DataType x;
    int pos;
    
    linkList * L = Init_List();
    if(Creat_List(L))
        printf("链表构造成功!n");
    else
        printf("链表构造失败!n");
    printf("遍历链表:");
    Traverse_List(L);
    
    printf("链表结点个数:%dnn", Length_List(L));
    
    printf("输入要求前趋结点的结点:");
    scanf("%d",&pos); 
    printf("第%d个结点的前趋结点:%dnn",pos,Prior_Value(L, pos));
    
    Insert_List(L, 2, 5);
    printf("插入结点:第2个结点n");
    printf("插入元素:5n");
    printf("遍历链表:");
    Traverse_List(L);
    
    Delete_List(L, 3, &x);
    printf("删除结点:第3个结点n");
    printf("被删除元素:%dn",x);
    printf("遍历链表:");
    Traverse_List(L);
    
    if(Destroy_List(L))
        printf("销毁成功!n");
    else
        printf("销毁失败!n");
     
    return 0; 
} 

linkList* Init_List()
{
    linkList * L = (linkList *)malloc(sizeof(linkList));    //    创建头结点 
    if(!L)
    {
        printf("申请空间失败!n");
        exit(-1);
    }
    
    L->next = L->prior = L;    //    空表,前趋指针和后继指针均指向其自身
    return L;                 //    返回头结点的地址 
}

bool Creat_List(linkList * L)
{
    int i,n,val;
    linkList * p = L;    //    保证L始终指向头结点 
    
    printf("请输入循环双链表的结点个数:");
    scanf("%d",&n);
    
    for(i=0; idata = val;
        p->next = q;
        q->prior = p;
        p = q;
    }
    
    p->next = L;    //    保证最后一个结点的后继指针指向头结点 
    L->prior = p;    //    保证头结点的前趋指针指向最后一个结点 
    return true;
}

int Length_List(linkList * L)
{
    int len = 0;
    linkList * p = L->next;    
     
    while(p!=L)    //    最后一个结点也要加上 
    {
        len++;
        p = p->next;
    }
    
    return len;
}

bool Empty_List(linkList * L)
{
    if(L->next==L&&L->prior==L)
        return true;
    else
        return false;
}

bool Insert_List(linkList * L, int pos, DataType x)
{
    int i = 1;
    linkList * p = L->next;
    
    if(pos<1||pos>Length_List(L))
        return false;
    
    while(inext;
    }
    
    linkList * q = (linkList*)malloc(sizeof(linkList));
    q->data = x;
    q->next = p->next;
    q->prior = p;
    p->next->prior = q;
    p->next = q;
    return true;
}

bool Delete_List(linkList * L, int pos, DataType * x)
{
    int i = 1;
    linkList * p = L->next;
    
    if(pos<1||pos>Length_List(L))
        return false;
    
    while(inext;
    }
    
    linkList * q = p->next;
    *x = q->data;
    p->next = q->next;
    q->next->prior = p;
    free(q);
    return true;
}

bool Destroy_List(linkList * L)
{
//    将循环双链表变成单链表 
    linkList * p = L->next;
    L->next = NULL;        //    空表时, 头结点的前趋指针、后继指针都是指向其自身 
    L->prior = NULL;    //    销毁时,头结点前趋指针、后继指针指向空 
    
    while(p)
    {
        linkList * q = p->next;
        free(p);
        p = q;
    }
    
    L = p = NULL; 
    return true;
}

bool Traverse_List(linkList * L)
{
    if(Empty_List(L))
        return false;
         
    linkList * p = L->next;
    
    while(p!=L)
    {
        printf("%3d",p->data);
        p = p->next;
    }
    
    printf("nn");
    
}

int Prior_Value(linkList * L, int pos)
{
    int i = 1;
    linkList * p = L->next;
    
    if(pos<1||pos>Length_List(L))
        return false;
    
    while(inext;
    }
    
    return p->prior->data;
    
}

转载请注明:文章转载自 http://www.konglu.com/
本文地址:http://www.konglu.com/it/352671.html
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【循环双链表(C语言实现)】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2