关于双链表的运算

#include <stdio.h>
#include <malloc.h>
typedef int ElemType;  //对int数据类型进行命名
typedef struct DNode{
    ElemType data;
    struct DNode *prior; //指向前驱结点
    struct DNode *next;  //指向后继结点
}DLinkNode;  //双链表结点的类型
void InitList(DLinkNode* &L){  //初始化双链表
    L=(DLinkNode *)malloc(sizeof(DLinkNode));
    L->prior=L->next=NULL;
}
void CreatListF(DLinkNode* &L,ElemType a[],int n){  //头插法进行插入
    L=(DLinkNode *)malloc(sizeof(DLinkNode));  //创建头结点
    L->prior=L->next=NULL;  //对头结点的前后数据置为空
    for(int i=0;i<n;i++){  //插入元素,n为元素的个数
        DLinkNode *s;  
        s=(DLinkNode *)malloc(sizeof(DLinkNode));  //创造一个结点,来插入新的元素
        s->data=a[i];  
        s->next=L->next;  //将结点s插入在原开始结点的前面,头结点的后面(即每一次插入元素之前,都设置一个s->next的位置,将上一次插入的元素依次放在后面)
        if(L->next!=NULL){  //将元素依次插入在头结点的后面
            L->next->prior=s;
            L->next=s;
            s->prior=L;
        }
    }
}
void CreatListR(DLinkNode* &L,ElemType a[],int n){  //尾插法进行插入
    DLinkNode *r;
    L=(DLinkNode *)malloc(sizeof(DLinkNode));  //创建头结点
    L->prior=L->next=NULL;
    r=L;  //r始终指向终端结点,开始=头结点,因为在插入数据之前头结点为NULL
    for(int i=0;i<n;i++){
        DLinkNode *s;
        s=(DLinkNode *)malloc(sizeof(DLinkNode));  //创建一个s结点
        s->data=a[i];
        r->next=s;  //将结点s插入在结点r之后
        s->prior=r;
        r=s;  //每次s都会取代r,即每次插入后s都会变成尾结点
    }
    r->next=NULL;  //尾结点的next与域值为NULL
}
void DestroyList(DLinkNode* &L){  //销毁线性表
    DLinkNode *pre=L,*p=pre->next;
    while(p!=NULL){
        free(pre);  //依次销毁p->next
        pre=p;
        p=pre->next;  
    }
    free(p);
}
bool ListEmpty(DLinkNode* &L){
   return(L->next==NULL);
}
int ListLength(DLinkNode *L){  //求线性表长度
    DLinkNode *p=L->next;
    int i=0;
    while(p!=NULL){
    i++;
    p=p->next;
    }
    return(i);
}
void DispList(DLinkNode *L){  //输出线性表
    DLinkNode *p=L->next;
    if(p!=NULL){
        printf("%c",p->data);
        p=p->next;
    }
    printf("\n");
}
bool GetElem(DLinkNode *L,int i,ElemType &e){  //求线性表中的第i个元素
    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){  //查找第一个值域e的元素序号
    int i=1;  //记录位置
    DLinkNode *p=L->next;
    while(p!=NULL&&p->data!=e){
        i++;
        p=p->next;
    }
    if(p==NULL){
        return 0;  //未找到
    }
    else{
        return i;
    }
}
bool ListInsert(DLinkNode* &L,int i,ElemType e){  //插入第i个元素
    int j=0;
    DLinkNode *p=L,*s;  //p指向头结点,j设置为0
    if(i<=0){
         return false;
    }  
    while(j<i-1&&p!=NULL){  //查找第i-1个结点p
        j++;
        p=p->next;
    }
    if(p==NULL){  
        return false;
    }
    else{
        s=(DLinkNode *)malloc(sizeof(DLinkNode));
        s->data=e;
        s->next=p->next;  //将结点s插入到p后
        if(p->next!=NULL){
            p->next->prior=s;
        }
        s->prior=p;
        p->next=s;
        return true;
    }
}
bool ListDelete(DLinkNode* &L,int i,ElemType &e){//删除第i个元素


}  
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值