#include<stdio.h>
#include<stdlib.h>
#define MAX 30
typedef struct s       //单向链表的存储结构
{
    int data;
    struct s *next;
}S,*LinkList;
typedef struct DuList   //双向链表的存储结构
{
    int data;
    struct DuList *prior;
    struct DuList *next;
}DuLNode,*DuLinkList;
int InitList(S *s)             //创建空的单链表
{
    s=(S *)malloc(sizeof(S));
    s->next=NULL;
    if(!s)return 0;
    else return 1;
}
void ShuChu(S *p1)       //输出单链表
{
        while(p1!=NULL)
    {
        printf("%d ",p1->data);
        p1=p1->next;
    }
}
void CreateList(LinkList s,int n)     //为所创建的单链表增加数据
{
    int i,m;
    S *r,*p1;
    S *p;
   // s=(S *)malloc(sizeof(S));
    s->next=NULL;
    r=s;
    for(i=0;i<n;i++)
    {
        scanf("%d",&m);
        p=(S *)malloc(sizeof(S));
        p->data=m;
        p->next=NULL;
        r->next=p;
        r=p;
    }
    p1=s->next;
    /*while(p1!=NULL)
    {
        printf("%d ",p1->data);
        p1=p1->next;
    }*/
    ShuChu(p1);
}
void ListInsert(S *s,int n,int m)       //单链表中值的插入
{
    int i=1;
    S *p,*r,*p1;
    p=(S *)malloc(sizeof(S));
    r=s->next;
    p->data=m;
    while(i<(n-1)&&r!=NULL)
    {
        r=r->next;
        i++;
    }
    if(i==n-1)
    {
        p->next=r->next;
        r->next=p;
    }
        p1=s->next;
        ShuChu(p1);
}
void ListDelect(S *s,int n)      //单链表删除
{
    int i=1;
    S *p,*p1,*q;
    p=s->next;
    while(i<n-1&&p)
    {
        p=p->next;
        i++;
    }
    if(i==n-1)
    {
        q=p->next;
        p->next=p->next->next;
        free(q);
    }
        p1=s->next;
        ShuChu(p1);
}
void LocateElem(S *s,int m)    //查找单链表中是否有要查找的值
{
    S *p;
    int i=1;
    p=s->next;
    while(p)
    {
        if(p->data==m)
        {
            printf("找到了!,其所在位置为%d",i);
            break;
        }
        i++;
        p=p->next;
    }
}
int DuInitList(DuLinkList s1)           //建立空的双向链表
{
    s1=(DuLNode *)malloc(sizeof(DuLNode));
    s1->next=NULL;
    if(!s1)return 0;
    else return 1;
}
void ShuChu1(DuLinkList s3)       //输出双向链表中的值
{
    while(s3)
    {
        printf("%d ",s3->data);
        s3=s3->next;
    }
    printf("\n");
}
void CreateList_DuL(DuLinkList s2,int n)     //向所创建的双向链表增加数
{
    s2->next=NULL;
    DuLinkList s3,r,s1;
    int i=1,m;
    r=s2;
    while(i<=n)
    {
            s3=(DuLNode *)malloc(sizeof(DuLNode));
        //    s3->next=NULL;
            scanf("%d",&m);
            s3->data=m;
            s3->next=NULL;
             r->next=s3;
             
            // s3->prior->next=s3;
             r=s3;
             i++;
    }
    s1=s2->next;
    ShuChu1(s1);
}
void ListInsert_DuL(DuLinkList s1,int n,int m1)         //向双向链表中插入数
{
      DuLinkList s2,p,s3;
      p=(DuLNode *)malloc(sizeof(DuLNode));
      int n1=1;
      s2=s1->next;
      while(s2&&n1<n-1)
      {
          s2=s2->next;
          n1++;
      }
      if(n1==n-1)
      {
          p->data=m1;
          p->next=s2->next;
          s2->next=p;
          p->next->prior=p;
          p->prior=s2;
      }
      s3=s1->next;
      ShuChu1(s3);
}
void ListDelect_DuL(DuLinkList s2,int n)      //删除双向链表第n个位置的值
{
    int i=1;
    DuLinkList s1,s3;
    s1=s2->next;
    while(i<n&&s1)
    {
        s1=s1->next;
        i++;
    }
    if(n==i)
    {
        s1->prior->next=s1->next;
        s1->next->prior=s1->prior;
    //i++;
    }
    s3=s2->next;
    ShuChu1(s3);
}
int main()
{
    S s,s1;
    DuLNode s2;
    int m,n,m1,n1;
    m=InitList(&s);
//    s1=s;
    if(m==1)
    printf("内存分配完成!\n");
    printf("请输入所创建的单链表的数据个数:\n");
    scanf("%d",&n);
    printf("请输入数:\n");
    CreateList(&s,n);
    printf("请输入要插入的数的位置及数:\n");
    scanf("%d%d",&m,&n);
    ListInsert(&s,m,n);
    printf("请输入要删除的数的位置:\n");
    scanf("%d",&n);
    ListDelect(&s,n);
    printf("请输入要查找的数:\n");
    scanf("%d",&m);
    LocateElem(&s,m);
    printf("\n");
    m1=DuInitList(&s2);
    if(m1==1)
    printf("双向链表初始化完成!\n");
        printf("请输入所创建的链表的数据个数:\n");
    scanf("%d",&n);
        printf("请输入数:\n");
    CreateList_DuL(&s2,n);
    printf("请输入要插入的数的位置以及数:\n");
    scanf("%d%d",&n,&m1);
    ListInsert_DuL(&s2,n,m1);
    printf("请输入要删除的数的位置:\n");
    scanf("%d",&n);
    ListDelect_DuL(&s2,n);
    return 0;
}

转载于:https://www.cnblogs.com/zmy1/p/10079919.html

单链表以及双向链表的操作相关推荐

  1. 「数据结构 | 链表」单链表、双向链表节点操作演示动画

    目录 1. 什么是链表 2. 链表数据结构 2.1 单链表数据结构(Java) 2.2 双向链表数据结构(Java) 3. 单链表操作动画 3.1 新增节点 3.2 删除节点 4. 双向链表操作动画 ...

  2. python之链表、单链表、双向链表、单向循环链表

    python之链表.单链表.双向链表.单向循环链表 链表 顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时,又需要进行数据的搬迁,所以使用起来并非很灵活 链表结构可以充分利用计算机 ...

  3. 【数据结构与算法】 01 链表 (单链表、双向链表、循环链表、块状链表、头结点、链表反转与排序、约瑟夫环问题)

    一.线性表 1.1 概念与特点 1.2 线性表的存储结构 1.3 常见操作 1.4 应用场景 二.链表 2.1 链表简介 2.2 单向链表(单链表) 2.21 基本概念 2.22 单链表基本操作 2. ...

  4. 线性表详解(静态链表、单链表、双向链表、循环链表)

    目录 申明 1. 线性表的定义 2. 线性表的抽象数据类型 3. 线性表的顺序存储结构 3. 1 顺序存储定义 3. 2 顺序存储方式 3. 3 数据长度与线性表长度区别 3. 4 地址计算方法 4. ...

  5. 顺序表和单链表的插入删除操作时间复杂度的区别

    顺序表和单链表的插入删除操作时间复杂度的区别 最近在学习数据结构,看到如果需要用到大量的插入和删除操作,单链表的效率会高于顺序表.看到这里时内有有个疑惑,这两种数据结构的插入和删除操作的时间复杂度不都 ...

  6. 2.3.3单链表的双向链表

    2.3.3双向链表 插入.删除 指在前驱和后驱方向都能游历(遍历)的线性链表 双向链表的每个结点有两个指针域 [结构]:prior data next 双链表通常采用带头结点的循环链表形式 可理解为首 ...

  7. 数据结构:单链表和双向链表

    1.链表 链表是有序的列表,但是它在内存中是存储如下 小结: 链表是以节点的方,来存储是链式存储 每个节点包含data域,next域:指向下一个节点 如图:发现链表的各个节点不一定是连续存储 链表分带 ...

  8. 链表详解(单链表、双向链表、链表逆序)

    目录 线性表 顺序存储结构 链式存储结构 单链表 单链表定义 单链表基本操作(仅供参考) 实例 循环单链表的状态图 双向链表 双向链表定义 双向链表特点 双向链表基本操作(仅供参考) 实例 双向链表的 ...

  9. 链表的基本概念以及java实现单链表-循环链表-双向链表

    前言 线性结构是非常简单且常用的数据结构,而线性表则是一种非常典型的线性结构. 线性表定义 线性表的数据结构 链表 单链表 单链表的定义 单链表的插入和删除 单链表的遍历,清空,判空,获取指定结点 循 ...

  10. [Java数据结构][3]单链表以及双向链表Java代码实现

    单链表Java代码实现,以水浒英雄链表为例 文章目录 单链表Java代码实现,以水浒英雄链表为例 定义一个英雄链表 定义一个SingleLinkedList 用于管理结点 初始化头结点以及添加结点到单 ...

最新文章

  1. Spring Boot 2.x基础教程:如何扩展XML格式的请求和响应
  2. MATLAB实用知识,如何对函数的输入进行检查和解析?
  3. GWT与Eclipse集成开发初步研究
  4. 韶关无线电厂台式计算机,中国芯片30年的历史 它背后有哪些不为人知的故事?...
  5. EF – 8.多对多关联
  6. 最近总结了串口(COM)读写操作的三种方式
  7. FD.io VPP环境下运行用户应用程序教程
  8. mysql统计记录数据库设计_MYSQL数据库设计,查询规范
  9. 前端----JavaScript
  10. 解决DOS窗口中文乱码问题
  11. 从感性和理性的角度谈APS系统
  12. Markdown语法快速入门(印象笔记)(从入门到精通,只有一步之遥)
  13. 【数据分析】黑色星期五(代码2)销售额分析1、2
  14. git Cherry-pick Failed your local changes would be overwritten by cherry-pick. hint: commit your
  15. si446使用记录(二):使用WDS3生成头文件
  16. IT产品是计算机类产品吗,IT产品是什么
  17. unity全栈开发是什么意思_为什么你应该尝试“全栈”
  18. 你觉得做程序员期间最开心的是什么?
  19. linux 什么是s权限、t权限?不是只有rwx权限吗
  20. 大功率电源36V 14A 500W 包含原理图PDF和PCB,及BOM 及变压器PFC电感设计

热门文章

  1. 那年,寻找工作的历程
  2. 微信小程序——尤克里里和弦查询
  3. placeholder—Jquery插件placeholder的使用方法
  4. Ant for Vue - input、select组件placeholder无法显示
  5. Vue学习之从入门到神经(两万字收藏篇)
  6. SqlServer支持多表关联的分页存储过程
  7. 经典排序算法(四)--基数排序Radix Sort
  8. Redis 彻底禁用RDB持久化
  9. ubuntu安装ffmpeg_手把手教你利用ffmpeg制作一个好用灵活的图片、视频压缩工具(再不需要去别的网站和用别的软件啦)...
  10. python如何获取权限_python 权限系统设计