热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C语言如何实现双向链表

本篇内容介绍了“C语言如何实现双向链表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何

本篇内容介绍了“C语言如何实现双向链表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

双向链表的基本操作

    1.利用尾插法建立一个双向链表。

    2.遍历双向链表。

    3.实现双向链表中删除一个指定元素。

    4.在非递减有序双向链表中实现插入元素e仍有序算法。

    5.判断双向链表中元素是否对称若对称返回1否则返回0。

    6.设元素为正整型,实现算法把所有奇数排列在偶数之前。

    7.在主函数中设计一个简单的菜单调试上述算法。

实例代码:

//排序的时候因为没有说明奇数和偶数需不需要各自再排序,我就没有排序,只是将奇数放在偶数后面。
//创建链表的时候,因为这个实验没有要求输出链表的长度,所以我就输入了一个长度为n的链表。
#include
#include
struct node
{
 int data;
 node *pre,*next;
}*h,*end;
void CreatList()//创建一个双向链表
{
 int n;
 node *s,*e;
 printf("请输入链表长度:    ");
 scanf("%d",&n);
 printf("请输入数据:      ");
 h=(node *)malloc(sizeof(node));
 s=(node *)malloc(sizeof(node));
 h->pre=NULL;
 e=h;
 e->next=s;
 s->pre=e;
 while(n--)
 {
 e=s;
 scanf("%d",&s->data);
 s=(node *)malloc(sizeof(node));
 e->next=s;
 s->pre=e;
 }
 s->next=NULL;
 end=s;
 return ;
}
void PrintList()//输出链表
{
 node *s;
 s=h->next;
 printf("链表数据:       ");
 while(s!=end)
 {
 printf("%d ",s->data);
 s=s->next;
 }
 printf("\n");
 return ;
}
void DeletList()//删除链表中的某个元素
{
 int x;
 int flag;
 node *s,*e;
 printf("请输入需删除元素:   ");
 scanf("%d",&x);
 s=h->next;
 e=h;
 flag=0;
 while(s!=end)
 {
 if(s->data==x)
 {
  e->next=s->next;
  s->next->pre=e;
  free(s);
  flag=1;
  break;
 }
 e=s;
 s=e->next;
 }
 if(!flag)
 printf("链表中不存在值为%d的元素。\n",x);//如果链表中没有x,输出这句话。
 return ;
}
void InsetList()//在有序链表中插入某个元素
{
 int x;
 node *s,*e;
 printf("输入需要插入的元素:  ");
 scanf("%d",&x);
 s=h->next;
 while(1)
 {
 if(s->data>=x)
 {
  e=(node *)malloc(sizeof(node));
  e->data=x;
  e->next=s;
  e->pre=s->pre;
  s->pre->next=e;
  s->pre=e;
  break;
 }
 else if(s==end)//将x放入链表末尾
 {
  end=(node *)malloc(sizeof(node));
  s->data=x;
  end->pre=s;
  end->next=NULL;
  s->next=end;
  break;
 }
 s=s->next;
 }
 return ;
}
void JudgeList()//判断双向链表是否对称
{
 node *s,*e;
 int flag=0;
 s=h->next;
 e=end->pre;
 while(s->data==e->data&&s!=end&&e!=h)
 {
 s=s->next;
 e=e->pre;
 }
 if(s==end&&e==h)
 printf("链表对称。\n");
 else
 printf("链表不对称。\n");
 return ;
}
void SortList()//将链表中的奇数放在偶数后面
{
 node *s;
 node *odd;
 int temp;
 odd=h->next;
 s=h->next;
 while(s!=end)
 {
 if(s->data%2!=0)
 {
  temp=odd->data;
  odd->data=s->data;
  s->data=temp;
  odd=odd->next;
  s=s->next;
 }
 else
  s=s->next;
 }
 return ;
}
int PrintMenu()//打印目录
{
 int T;
 printf("******************目录******************\n");
 printf("创建一个双向链表:           1\n");
 printf("输出链表:               2\n");
 printf("删除链表中的指定元素:         3\n");
 printf("向链表中插入元素:           4\n");
 printf("判断链表是否对称:           5\n");
 printf("排列链表:               6\n");
 printf("操作结束:               0\n");
 printf("输入操作指令:     ");
 scanf("%d",&T);
 switch(T)
 {
 case 1:CreatList();break;
 case 2:PrintList();break;
 case 3:DeletList();break;
 case 4:InsetList();break;
 case 5:JudgeList();break;
 case 6:SortList();break;
 case 0:return 1;
 default:printf("输入错误。请重新输入。\n");
 }
 return 0;
}
int main()
{
 int flag;
 while(1)
 {
 flag=PrintMenu();
 if(flag)//通过flag控制循环的跳出
  break;
 }
 printf("谢谢使用!\n");
 return 0;
}

“C语言如何实现双向链表”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程笔记网站,小编将为大家输出更多高质量的实用文章!


推荐阅读
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
author-avatar
泰坦尼雅牧民
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有