• 循环双链表


    #include <stdio.h>  
    #include "Dlink.h"

    int main(void)
    {
    DLink *L;
    int i = 0;
    ElemType e = '0';

    //认真体会C语言拷贝传递的思想
    InitList(&L);
    InsElem(L, 'a', 1);
    InsElem(L, 'b', 2);
    InsElem(L, 'c', 3);
    InsElem(L, 'd', 4);
    InsElem(L, 'e', 5);

    printf("线性表");
    DispList(L);

    printf("长度:%d/n",GetLength(L));

    i = 3;
    GetElem(L, i, &e);
    printf("第%d个元素:%c/n", i, e);

    e = 'a';
    printf("元素%c是第%d个元素/n", e, Locate(L, e));

    i = 4;
    printf("删除第%d个元素/n", i);
    DelElem(L, i);
    printf("线性表:");
    DispList(L);
    /**/
    return 0;
    }


    [cpp] view plaincopyprint?
    #ifndef DLINK
    #define DLINK

    typedef char ElemType;

    typedef struct node
    {
    ElemType data;
    struct node *prior, *next;
    }DLink;

    void InitList(DLink **L); //初始化运算
    int GetLength(DLink *L); //求表长运算
    int GetElem(DLink *L, int num, ElemType *e); //求线性表中第i个元素运算
    int Locate(DLink *L, ElemType x); //按值查找运算
    int InsElem(DLink *L, ElemType x, int i); //插入节电运算
    int DelElem(DLink *L, int num); //删除结点运算
    void DispList(DLink *L); //输出线性表

    #endif


    [cpp] view plaincopyprint?
    #include <stdio.h>
    #include "Dlink.h"
    #include <malloc.h>

    /************************************************
    ** 函数名:void InitList(DLink **L)
    ** 功能: 初始化线性表运算
    ** 描述: 无
    ** 作者: 庞辉
    ************************************************
    */

    void InitList(DLink **L)
    {
    *L = (DLink *)malloc(sizeof(DLink));
    (*L)->prior = (*L)->next = *L;
    }

    /************************************************
    ** 函数名:int getLength(DLink *L)
    ** 功能: 获取链表的长度
    ** 描述: 无
    ** 作者: 庞辉
    ************************************************
    */

    int GetLength(DLink *L)
    {
    int i = 0;
    DLink *p = L->next;

    while(p != L)
    {
    i++;
    p = p->next;
    }

    return i;
    }

    /************************************************
    ** 函数名:int GetElem(DLink *L, int num, ElemType *e)
    ** 功能: 求线性表中第i个元素运算
    ** 描述: 出错返回-1,成功返回0
    ** 作者: 庞辉
    ************************************************
    */

    int GetElem(DLink *L, int num, char *e)
    {
    int j = 1;
    DLink *p = L->next;

    if(num < 1 || num > GetLength(L))
    {
    return -1;
    }

    while(j < num)
    {
    p = p->next;
    j++;
    }
    *e =p->data;

    return 0;
    }

    /************************************************
    ** 函数名:int Locate(DLink *L, ElemType x)
    ** 功能: 求某元素在线性表中的位置
    ** 描述: 出错返回-1,成功返回位于线性表第几个元素
    ** 作者: 庞辉
    ************************************************
    */

    int Locate(DLink *L, ElemType x)
    {
    DLink *p = L->next;
    int i = 1; //起始位置1

    //while(i < GetLength(L) && p->data != x)
    while(p != L && p->data != x)
    {
    p = p->next;
    i++;
    }

    if(p == L)
    {
    return -1;
    }
    else
    {
    return i;
    }
    }

    /************************************************
    ** 函数名:int InsElem(DLink *L, ElemType x, int num)
    ** 功能: 在线性表某个位置插入某元素
    ** 描述: 出错返回-1
    ** 作者: 庞辉
    ************************************************
    */

    int InsElem(DLink *L, ElemType x, int num)
    {
    DLink *p = L,*s;
    //s = (DLink *)malloc(sizeof(DLink));
    int j = 1;
    s = (DLink *)malloc(sizeof(DLink)); //这句必须放在int j = 1;定义的后面,VC6使用的非C99标准,定义必须放前面

    if(num < 1 || num > GetLength(L) + 1) //注意考虑可以插入在最后一位,所以是GetLength(L)+1
    {
    free(s);
    return -1;
    }

    s->data = x;
    while(j < num) //指向待插入位置前一个结点
    {
    p = p->next;
    j++;
    }

    s->next = p->next;
    s->next->prior = s;
    s->prior = p;
    p->next = s;

    return 0;
    }

    /************************************************
    ** 函数名:int DelElem(DLink *L, int num)
    ** 功能: 删除线性表某位置的元素
    ** 描述: 出错返回-1
    ** 作者: 庞辉
    ************************************************
    */

    int DelElem(DLink *L, int num)
    {
    DLink *p = L, *q;
    int j = 1;

    if(num < 1 || num > GetLength(L))
    {
    return -1;
    }

    while(j < num) //指向待删除元素的前一个结点
    {
    p = p->next;
    j++;
    }

    q = p->next; //指向待删除元素

    q->next->prior = p;
    p->next = q->next;

    free(q);

    return 0;
    }

    /************************************************
    ** 函数名:void DispList(DLink *L)
    ** 功能: 输出线性表
    ** 描述: 无
    ** 作者: 庞辉
    ************************************************
    */

    void DispList(DLink *L)
    {
    DLink *p = L->next;

    while(p != L)
    {
    printf("%c ",p->data);
    p = p->next;
    }
    printf("/n");
    }



  • 相关阅读:
    线段树、最短路径、最小生成树、并查集、二分图匹配、最近公共祖先--C++模板
    数据结构中各种树
    你必须知道的基本位运算技巧(状压DP、搜索优化都会用到)
    memset为int型数组初始化问题
    Dev-C++添加代码格式化(format source code)工具Artistic Style
    让vs IIS Express支持本地静态Json文件
    什么是「供给侧改革」? 原标题:中央提的“供给侧改革”是啥意思?有谁能解说下吗?
    PowerDesigner用法和技巧
    php 调用 web Server(短信接口示例)
    sae相关配置
  • 原文地址:https://www.cnblogs.com/pang123hui/p/2309942.html
Copyright © 2020-2023  润新知