文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言怎么实现循环双链表

2023-06-25 12:13

关注

这篇文章主要介绍“C语言怎么实现循环双链表”,在日常操作中,相信很多人在C语言怎么实现循环双链表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言怎么实现循环双链表”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

具体内容如下

#include<stdio.h>#include<stdlib.h>#include<stdbool.h> 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("链表结点个数:%d\n\n", Length_List(L));        printf("输入要求前趋结点的结点:");    scanf("%d",&pos);     printf("第%d个结点的前趋结点:%d\n\n",pos,Prior_Value(L, pos));        Insert_List(L, 2, 5);    printf("插入结点:第2个结点\n");    printf("插入元素:5\n");    printf("遍历链表:");    Traverse_List(L);        Delete_List(L, 3, &x);    printf("删除结点:第3个结点\n");    printf("被删除元素:%d\n",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; i<n; ++i)    {        printf("第%d个结点:",i+1);        scanf("%d",&val);                LinkList * q = (LinkList*)malloc(sizeof(LinkList));        q->data = 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(i<pos-1&&L!=p)    //    指针移动到被插入结点的前一个结点     {        i++;        p = p->next;    }        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(i<pos-1&&L!=p)    {        i++;        p = p->next;    }        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("\n\n");    } int Prior_Value(LinkList * L, int pos){    int i = 1;    LinkList * p = L->next;        if(pos<1||pos>Length_List(L))        return false;        while(i<pos&&L!=p)    //    指向pos要求的结点     {        i++;        p = p->next;    }        return p->prior->data;    }

到此,关于“C语言怎么实现循环双链表”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯