双链表的基本运算

#include<iostream>
using namespace std;
#include<malloc.h>
typedef char ElemType;
typedef struct DNode
{
    ElemType data;
    struct DNode *prior;
    struct DNode *next;
}DLinkNode;

void CreateListF(DLinkNode *&L,ElemType a[],int n)//头插法
{
    DLinkNode *s;
    L  = (DLinkNode*)malloc(sizeof(DLinkNode));
    L->prior = L->next = NULL;
    for(int i =0;i<n;i++)
    {
        s = (DLinkNode *)malloc(sizeof(DLinkNode));
        s->data = a[i];
        s->next = L->next;
        if(L->next != NULL)//结点s插在原开始结点之前,头结点之后
            L->next->prior = s;
        L->next = s;
        s->prior = L;
    }
}

void CreateListR(DLinkNode *&L,ElemType a[],int n)//尾插法
{
    DLinkNode *s,*r;
    L  = (DLinkNode*)malloc(sizeof(DLinkNode));//头结点
    L ->prior = L->next = NULL;
    r = L;//r始终指向终端结点。开始为头结点
    for(int i = 0;i<n;i++)
    {
        s =(DLinkNode*)malloc(sizeof(DLinkNode));//创建新结点
        s->data  = a[i];
        r->next = s;//s插入r之后
        s->prior = r;
        r = s;
    }
    r->next = NULL;
}

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

void DestoryList(DLinkNode *&L)
{
    DLinkNode *pre = L;
    DLinkNode *p = L->next;
    while(p != NULL)
    {
        free(pre);
        pre = p;
        p = p->next;//pre p 同时后移
    }
    free(p);
}

bool ListEmpty(DLinkNode *L)
{
    return (L->next == NULL);
}

int ListLength(DLinkNode *L)
{
    DLinkNode *p = L;
    int i = 0;
    while(p->next != NULL)
    {
        i++;
        p = p->next;
    }
    return (i);
}

void DispList(DLinkNode *L)
{
    DLinkNode *p= L->next;
    while(p != NULL)
    {
        cout<<p->data;
        p = p->next;
    }
    cout<<endl;
}
bool GetElem(DLinkNode *L,int i,ElemType &e)
{
    int j = 0;
    DLinkNode *p = L;
    if(i < 0)
        return false;
    while(j < i && p != NULL )
    {
        j++;
        p = p->next;
    }
    if(p == NULL)
    {
        return false;
    }
    else
    {
        e = p->data;
        return true;
    }
}

int LocateElem(DLinkNode *L,ElemType e)
{
    int  i = 1;
    DLinkNode *p = L->next;
    while(p!= NULL && p->data != e)//查找第一个值为e的
    {
        i++;
        p = p->next;
    }
    if(p == NULL)
    {
        return false;
    }
    else
    {
        return (i);
    }
}

bool ListInsert(DLinkNode *&L,int i,ElemType e)
{
    int j = 0;
    DLinkNode *p = L;
    DLinkNode *s;
    if(i < 0)
        return false;
    while(p!=NULL && j < i -1)//查找待插入的前一个
    {
        j++;
        p = p->next;
    }
    if(p == NULL)
        return  false;
    else
    {
        s = (DLinkNode*)malloc(sizeof(DLinkNode));//找到前一个
        s->data = e;
        s->next = p->next;
        if(p->next != NULL)
        {
            p->next->prior = s;//s插入p之后
        }
        s->prior = p;
        p->next = s;
    }
}

bool ListDelete(DLinkNode *&L,int i,ElemType &e)
{
    int j = 0;
    DLinkNode *p = L;
    DLinkNode *q;
    if(i<=0) return false;
    while(j < i-1 && p != NULL)//查找第i-1个
    {
        j++;
        p = p->next;
    }
    if(p == NULL)
    {
        return false;
    }
    else
    {
        q = p->next;//找到 q指向第i-1个
        if(q == NULL )
        {
            return false;
        }
        else
        {
            e = q->data;
            p->next = q->next;//删除
            if(p->next != NULL)
            {
                p->next->prior = p;
            }
            free(q);//释放q
            return true;
        }
    }
}

int main()
{
    DLinkNode *d;
    ElemType e;
    cout<<"双链表操作"<<endl;
    InitList(d);
    ListInsert(d,1,‘a‘);
    ListInsert(d,2,‘b‘);
    ListInsert(d,3,‘c‘);
    ListInsert(d,4,‘d‘);
    ListInsert(d,5,‘e‘);
    cout<<"D-> ";
    DispList(d);
    cout<<"The Length is "<<ListLength(d)<<endl;
    cout<<"The third Elem is:";
    GetElem(d,3,e);
    cout<<e<<endl;
    cout<<"Delete fourth Elem->";
    ListDelete(d,4,e);
    DispList(d);
    return 1;
} 

 运算结果

原文地址:https://www.cnblogs.com/ygsworld/p/10023710.html

时间: 2024-11-08 21:48:24

双链表的基本运算的相关文章

数据结构实践——循环双链表应用

本文针对数据结构基础系列网络课程(2):线性表的实践项目. [项目- 循环双链表应用] 设非空线性表ha和hb都用带头节点的循环双链表表示.设计一个算法Insert(ha,hb,i).其功能是:i=0时,将线性表hb插入到线性表ha的最前面:当i>0时,将线性表hb插入到线性表ha中第i个节点的后面:当i大于等于线性表ha的长度时,将线性表hb插入到线性表ha的最后面. 请在实现算法时,除项目中给出的特殊要求,其余工作均可利用项目4完成的算法支持. [参考解答](循环双链表的基本运算算法,请参考

数据结构之自建算法库——循环双链表

本文针对数据结构基础系列网络课程(2):线性表中第13课时循环链表. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 双链表算法库算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:cdlinklist.h,包含定义双链表数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef CDLINKLIST_H_INCLUDED #define CDLINKLIST_H_INCLUDED //循环双链表基本运算函数 typedef int E

双链表的实现

双链表:可以从一个表结点出发,在线性表中随意访问它的前驱结点和后继结点,双链表有两个指针. 双链表结template<class Elem> class Link   private:       static Link<Elem>* freelist ;//Head of the freelis   public: Elem element;//value for this node Link *next;//pointer to next node in list Link *

优先双链表

题目: 设有一个双链表,每个结点中除有prior,data和 next这3个域外,还有一个访问频度域 freq,在链表被启用前其值均初始化为0.每当在在链表上进行一次查找操作Locate(L, x)时,令元素值为x的结点中的freq域的值增加1,并使此链表中的结点保持按访问频度域递减的顺序排列,以便使频繁访问的结点总是靠近表头 (1)首先创建一个双链表. (2) 设计一个符合上述要求的Locate(L, x)函数. (3) 具有输出显示访问频度功能. (4) 要求程序通过一个主菜单进行控制,在主

1216.1——双链表

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. typedef struct node{ struct node *pre;   //前驱指针 int age; struct node *next;  //后驱指针 }Node; int main(int argc, const char * argv[]) { Node * phead =

双链表优先队列ADT的实现与测试

源代码如下: #include <stdlib.h> #include <stdio.h> typedef struct pq* PQ; typedef struct PQnode* PQlink; struct Item{int data;char c;}; struct PQnode{Item key;PQlink prev,next;}; struct pq{PQlink head,tail;}; PQ PQinit(){ PQ pq = (PQ)malloc(sizeof*

双链表删除/插入节点

//双链表删除节点 dnode *del(dnode *head, int num) { dnode *p1, *p2; p1 = head; while (num != p1->data && p1->next != NULL) { p1 = p1->next; } if (num == p1->data) { if (p1 == head) { head = head->next; head->pre = NULL; free(p1); } else

redis源码分析(3)-- 基本数据结构双链表list

一.双链表结构 redis中实现的双链表结构体如下: 1 typedef struct list { 2 listNode *head; # 链表头 3 listNode *tail; # 链表尾 4 void *(*dup)(void *ptr); # 复制链表函数 5 void (*free)(void *ptr); # 释放节点函数 6 int (*match)(void *ptr, void *key); # 匹配函数 7 unsigned long len; # 链表节点个数 8 }

线性表—双链表

1.基础知识 a.双链表结点的结构:其由前序元素地址,数据域,后继元素地址组成. b.双链表结点的连接方法:先声明该结点,可以在内部也可以利用其特性来表明前序结点和后继结点是什么,之后同时还需要说明"其前序结点的后继地址为该结点"和"其后继结点的前序地址为该结点.(本质:双向) 2.循环双链表的实现 线性表接口LList package com.clarck.datastructure.dlinked; /*** 线性表接口LList,描述线性表抽象数据类型,泛型参数T表示数