zoukankan      html  css  js  c++  java
  • 01.一个双向链表

    这本书看起来应该还不错,是牛人很多年的经验探索的总结,我不敢下结论它一定很好,但我可以保证按上面的要求把它读完。

    我很笨,所有我只会一点一点进步。

    用c语言写一个双向链表。完成任务后再继续往下读.

    用了几天的空闲时间,终于完成了,个人感觉比较满意。当然不足的地方还有很多

    /*************************************************
    * 名字: 双向链表 *
    * 作者: YY *
    * 完成日期: 2011.11.21 *
    * 编译环境: VC6.0 *
    * 说明: 初始化时只能输入0-9,插入时可输入int型整数 *
    ************************************************
    */

    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>

    //打印选项
    void printTheSelect()
    {
    printf("\n1.初始化双向链表\n2.打印双向链表\n3.逆序打印双向链表\n");
    printf("4.求链表长度\n5.判断链表是否为空\n6.清空链表\n");
    printf("7.插入元素\n8.删除元素\n9.删除链表\n0.退出\n");
    }

    typedef struct DuLnode
    {
    int data; //数据
    struct DuLnode *prior; //前驱
    struct DuLnode *next; //后继
    }DuLnode,*DuLinkList;

    //初始化双向链表
    void initDlist(DuLinkList &L)
    {
    char x; //定义成char型是用于输入'q'时可以退出,其实定义成int也能退出
    DuLinkList p,q;

    L = (DuLinkList)malloc(sizeof(DuLnode));
    L->next = NULL;
    L->prior = NULL; //构造头结点
    p = L;

    printf("输入双向链表的元素,每输入一个元素后按回车,输入q表示结束.\n");
    fflush(stdin); //清空输入缓冲区
    x=getchar();
    while( x != 'q')
    {
    q = (DuLinkList)malloc(sizeof(DuLnode));
    q->data = x - 48; //得到的是输入字符的ASCII码,减去30H就变成想要的数字,十六进制30h即为十进制48
    q->next = NULL;
    q->prior = p;
    p->next = q;
    p = q;
    fflush(stdin);
    x=getchar();
        }
    if( x == 'q' )
    {
    printf("双向链表构造完毕!\n");
    }

    }

    //打印双向链表
    void printDlist(DuLinkList &L)
    {
    DuLinkList p;

    if(L == NULL)
    {
    printf("链表不存在,请先初始化!\n");
    }
    else if(L->next == NULL)
    {
    p = L->next;
    printf("链表为空!\n");
    }
    else
    {
    p = L->next;
    while(p)
    {
    printf("%d ",p->data);
    p = p->next;
    }
    }
    }

    //逆序打印双向链表
    void printDlistFromLast(DuLinkList &L)
    {
    DuLinkList p;

    if(L == NULL)
    {
    printf("链表不存在,请先初始化!\n");
    }
    else if( L->next == NULL )
    {
    p = L->next;
    printf("链表为空!\n");
    }
    else
    {
    p = L->next;
    while(p->next)
    {
    p = p->next;
    }

    while(p->prior)
    {
    printf("%d ",p->data);
    p = p->prior;
    }
    }
    }

    //求链表长度
    int lengthDlist(DuLinkList &L)
    {
    int i = 0;

    if(L == NULL)
    {
    printf("链表不存在,请先初始化!\n");
    }
    else
    {
    DuLinkList p = L->next;
    while(p)
    {
    i++;
    p = p->next;
    }
    }

    return i;
    }

    //判断链表是否为空
    void isEmptyOrNotDlist(DuLinkList &L)
    {
    if(L == NULL)
    {
    printf("链表不存在,请先初始化!\n");
    }
    else if( L->next == NULL )
    {
    printf("链表为空!\n");
    }
    else
    {
    printf("链表非空!\n");
    }
    }

    //把双向链表置空
    void clearTheDlist(DuLinkList &L)
    {
    if(L==NULL)
    {
    printf("链表不存在,请先初始化!\n");
    }
    else
    {
    DuLinkList p,q;
    p = q = L->next; //是p、q指向第一个元素
    L->next = NULL;

    while(p) //逐个释放元素所占内存
    {
    p = p->next;
    free(q);
    q = p;
    }
    }
    }

    //删除双向链表
    void delTheDlist(DuLinkList &L)
    {
    clearTheDlist(L);
    free(L);
    L = NULL;
    }

    //在双向链表中第i个位置后面插入元素m
    void insertElmToDlist(DuLinkList &L)
    {
    int i,m;
    printf("输入插入的元素:\n");
    scanf("%d",&m);
    printf("输入插入的位置:\n");
    scanf("%d",&i);
    DuLinkList p,q;
    p = L;
    int j = 0;

    if(L == NULL)
    {
    printf("链表不存在,请先初始化!\n");
    }
    else if(L->next == NULL)
    {
    printf("链表为空,请初始化后再进行插入数据操作!\n");
    }
    else if( i<1 || i>lengthDlist(L)+1 )
    {
    printf("插入位置错误!\n");
    }
    else
    {
    while( j<i )
    {
    p = p->next;
    j++;
    }

    if( j == lengthDlist(L) ) //如果在最后一个元素后面插入m
    {
    q = (DuLinkList)malloc(sizeof(DuLnode));
    q->data = m;
    q->next = NULL;
    q->prior = p;
    p->next = q;
    }
    else
    {
    q = (DuLinkList)malloc(sizeof(DuLnode));
    q->data = m;
    q->next = p->next;
    p->next->prior = q;
    p->next = q;
    q->prior = p;
    }
    }
    }

    //删除双向链表中的第i个元素
    void delElmFromDlist(DuLinkList &L)
    {
    int i;
    printf("输入要删除的位置:");
    scanf("%d",&i);
    int j = 0;
    DuLinkList p = L;

    if(L == NULL)
    {
    printf("链表不存在,请先初始化!\n");
    }
    else if( i<1 || i>lengthDlist(L) )
    {
    printf("删除的位置不存在!\n");
    }
    else
    {
    while( j<i )
    {
    p = p->next;
    j++;
    }

    if( j == lengthDlist(L) )
    {
    p->prior->next = NULL;
    free(p);
    }
    else
    {
    p->prior->next = p->next;
    p->next->prior = p->prior;
    free(p);
    }
    }
    }


    int main()
    {
    int i;
    DuLinkList L = NULL;
    printTheSelect();
    printf("请输入操作:");
    scanf("%d",&i);
    while( 0 != i)
    {
    switch(i)
    {
    case 1:initDlist(L);
    break;
    case 2:printDlist(L);
    break;
    case 3:printDlistFromLast(L);
    break;
    case 4:printf("链表长度为:%d\n",lengthDlist(L));
    break;
    case 5:isEmptyOrNotDlist(L);
    break;
    case 6:clearTheDlist(L);
    break;
    case 7:insertElmToDlist(L);
    break;
    case 8:delElmFromDlist(L);
    break;
    case 9:delTheDlist(L);
    break;
    default:printf("输入错误,请重新输入!\n");
    break;
    }
    printTheSelect();
    printf("请输入操作:");
    scanf("%d",&i);
    }
    if(0 == i)
    {
    printf("程序退出....\n");
    }
    return 0;
    }


     

  • 相关阅读:
    【体系结构】Oracle 11g体系结构总览
    【RMAN】RMAN初探
    【RAC】Oracle 11g 启动、停止实例和RAC数据库
    【RAC】Oracle 11g RAC安装及配置(三)
    【RAC】Oracle 11g RAC安装及配置(二)
    【RAC】Oracle 11g RAC安装及配置(一)
    【Linux】mount、umount命令
    领域模型(DomainModel)与视图模型(ViewModel)
    ASP.NET MVC与ASP.NET WebForm
    Visual Studio 2017 插件扩展
  • 原文地址:https://www.cnblogs.com/wblyuyang/p/2256863.html
Copyright © 2011-2022 走看看