数据结构——双向循环链表(C语言)

  • 1.双向循环链表的创建
  • 2.双向循环链表的插入
  • 3.双向循环链表的删除
  • 4.遍历双向循环链表
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10010
#define ElemType int
typedef struct DuLNode{
    ElemType data;
    struct DuLNode *prior,*next;

}DuLNode,*DuLinkList;
//创建双向循环链表
DuLinkList CreateList(int n){
    DuLinkList head=(DuLNode *)malloc(sizeof(DuLNode));
    DuLinkList q=head;
    head->next=NULL;
    head->prior=NULL;
    DuLNode *p;
    while(n--){
        int elem;
        p=(DuLNode *)malloc(sizeof(DuLNode));
        printf("输入:");
        scanf("%d",&elem);
        p->data=elem;
        p->next=p;
        p->prior=p;
        q->next=p;
        p->prior=q;
        q=p;
    }
    p->next=head;
    head->prior=p;
    return head;
}
//双向循环链表指定位置插入(后插)
bool InsertElem(DuLNode *list1,int index,ElemType e){
    DuLNode *p=(DuLNode *)malloc(sizeof(DuLNode));
    p->data=e;
    p->next=NULL;
    p->prior=NULL;
    DuLNode *head=list1;
    DuLNode *h=head->next;
    int count1=0;
    while(h&&(h!=head)&&count1<index){
        h=h->next;
        count1++;
    }

    if(h&&count1==index){
        p->next=h->next;
        p->next->prior=p;
        h->next=p;
        p->prior=h;
    }else
        return false;
    return true;
}
//双向循环链表删除指定值
bool DeleteElem(DuLNode *list1,ElemType e){
    DuLNode *head=list1;
    DuLNode *p=head->next;
    while(p&&(p!=head)&&p->data!=e){
        p=p->next;
    }
    if(p&&p->data==e){
        p->prior->next=p->next;
        p->next->prior=p->prior;
        free(p);
    }else
        return false;
    return true;
}
//双向循环链表遍历
void display(DuLNode *list1){
    DuLNode *head=list1;
    DuLNode *p=head->next;
    while(p&&(p!=head)){
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}
//判断操作结果是否成功
void check(bool flag){
    if(flag){
        printf("操作成功!\n");
    }else{
        printf("操作失败!\n");
    }
}
int main(){
    int n;//链表结点数
    int elem;
    DuLinkList duList;
    printf("创建双向链表\n");
    printf("输入结点个数:");
    scanf("%d",&n);
    duList=CreateList(n);
    while(1){
        int op;
        int index;
        int elem;
        bool flag;
        printf("请选择操作\n1.指定位置之后插入\n2.删除指定值的元素\n3.打印\n");
        scanf("%d",&op);
        switch(op){
        case 1:
            scanf("%d %d",&index,&elem);
            flag=InsertElem(duList,index,elem);
            check(flag);
            break;
        case 2:
            scanf("%d",&elem);
            flag=DeleteElem(duList,elem);
            check(flag);
            break;
        case 3:
            display(duList);
            break;
        default:

            break;
        }
    }
    return 0;
}

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值