循环双链表的实现(C语言)

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int DataType;

typedef struct node{
    DataType data;
    struct node *prior,*next;
}DLNode,*CDLinkList;
int go_on(){
    int flag=1,i;
    char choice;
    while (1) {
        printf("继续请输入1,停止请输入0\n");
        scanf("%d",&i);
        if (i==1) {
        break;
        }
        else if (i==0) {
        flag=0;
        break;
        }
        else {
        printf("请按要求输入,谢谢\n");
        }
    }
    return (flag);
}

// 初始化,构造一个空的带头结点的循环双链表
void Init_CDLinkList(CDLinkList *L){
    *L=(DLNode *)malloc(sizeof(DLNode));
    if (*L==NULL) {
        printf("分配失败\n");
        exit(-1);
    }
    (*L)->prior=*L;
    (*L)->next=*L;
}
// 判断链表是否为空
int Empty_CDLinkList(CDLinkList L){
    if (L->prior==L&&L->next==L) {
        return 1;
    }
    else {
        return 0;
    }
}
// 求循环双链表长度运算
int Length_CDLinkList(CDLinkList L){
    DLNode *p=L;
    int k;
    k=0;
    while (p->next!=L) {
        k++;
        p=p->next;
    }
    return k;
}
void Length(CDLinkList L){
    int k;
    k=Length_CDLinkList(L);
    printf("\n表的长度为:%d\n",k);
}
// 按序号查找元素的运算
// 在头结点的循环双链表中查找第i个元素,若查找成功返回指向第i个元素节点的指针,否则返回为空
DLNode *Locatei_CDLinkList(CDLinkList L,int i){
    DLNode *p=L;
    int j=0;
    while (p->next!=L&&j<i) {
        j++;
        p=p->next;
    }
    if (j==i) {
        return p;
    }
    else {
        return NULL;
    }
}
void Locatei(CDLinkList L){
    DLNode *p;
    int flag=1,i;
    while (flag) {
        printf("\n请输入要查找元素的位置:");
        scanf("%d",&i);
        p=Locatei_CDLinkList(L,i);
        if (p!=NULL) {
            printf("\n查找成功,第%d个元素是%d",i,p->data);
        }
        else {
            printf("\n查找失败,没有第%d个元素\n",i);
            
        }
        flag=go_on();
    }

}
// 按值查找元素
// 在头结点的循环双链表中查找值为x的元素,若查找成功则返回指向元素x所在节点的指针,*k返回其位续,否则返回为空
// 顺序查找
DLNode *Locatex_CDLinkList(CDLinkList L,int x,int *k){
    DLNode *p=L->next;
    int j=1;
    while (p!=L&&p->data!=x) {
        j++;
        p=p->next;
    }
    if(p!=L){
        *k=j;
        return p;
    }
    else {
    return NULL;
    }
}
void Locatex(CDLinkList L){
    DLNode *p;
    DataType x;
    int flag=1,k;
    while (flag) {
        printf("\n请输入要查找的值:\n");
        scanf("%d",&x);
        p=Locatex_CDLinkList(L,x,&k);
        if(p!=NULL){
            printf("\n查找成功,%d是第%d个元素\n",p->data,k);
        }
        else {
        printf("\n查找失败,无元素\n");
        }
        flag=go_on();
    }
}
// 插入元素
int Insert_CDLinkList(CDLinkList L,int i,DataType x){
    DLNode *p,*s;
    int len;
    len=Length_CDLinkList(L);
    if (i<1||i>len+1) {
        printf("\n插入位置错误,不能插入\n");
        return 0;
    }
    // 查找第i-1个结点
    p=Locatei_CDLinkList(L,i-1);
    s=(DLNode *)malloc(sizeof(DLNode));
    if (s==NULL) {
        printf("\ns的内存分配失败\n");
        exit(-1);
    }
    s->data=x;
    s->prior=p;
    s->next=p->next;
    p->next->prior=s;
    p->next=s;
    return 1;
}
void Insert(CDLinkList L){
    DataType x;
    int i,flag=1,insert_flag;
    while (flag) {
        printf("\n请输入要插入元素的位置:\n");
        scanf("%d",&i);
        printf("\n请输入要插入的元素\n");
        scanf("%d",&x);
        insert_flag=Insert_CDLinkList(L,i,x);
        if (insert_flag==1) {
            printf("\n插入成功\n");
        }
        else {
            printf("\n插入失败\n");
        }
        flag=go_on();
    }
}
// 删除元素
int Delete_CDLinkList(CDLinkList L,int i){
    CDLinkList p,s;
    int j,len;
    j=Empty_CDLinkList(L);
    if (j==1) {
        printf("\n表空,不能删除\n");
        return 0;
    }
    len=Length_CDLinkList(L);
    if (i<1||i>len) {
        printf("\n删除位置不对哦\n");
        return 0;
    }
    p=Locatei_CDLinkList(L,i-1);
    s=p->next;
    p->next=s->next;
    s->next->prior=p;
    free(s);
    return 1;
}
void Delete(CDLinkList L){
    int i,flag=1,delete_flag;
    while (flag) {
        printf("\n请输入要删除的元素的位置\n");
        scanf("%d",&i);
        delete_flag=Delete_CDLinkList(L,i);
        if (delete_flag==1) {
            printf("\n删除成功\n");
        }
        else {
            printf("\n删除失败\n");
        }
        flag=go_on();
    }
}
// 输出链表
void Display_CDLinkList(CDLinkList L){
    DLNode *p=L;
    if (Empty_CDLinkList(L)==1) {
        printf("\n表空,没有元素\n");
    }
    else {
        printf("\n循环双链表输出所有元素\n");
        while (p->next!=L) {
            p=p->next;
            printf("%6d",p->data);
        }
    }
}
main(){
    CDLinkList L;
    int choice;
    int flag=1;
    Init_CDLinkList(&L);
    do {
        printf("\n");
        printf("-------循环双链表,带头结点---------\n");
        printf("插入元素请摇1\n");
        printf("删除元素请摇2\n");
        printf("按位查找元素请摇3\n");
        printf("按值查找元素请摇4\n");
        printf("输出表长请摇5\n");
        printf("输出表元素请摇6\n");
        printf("退出请摇0\n");
        printf("----------------------\n");
        printf("请输入你的选择:\n");
        scanf("%d",&choice);
         switch (choice) {
        case 1:Insert(L);break;
        case 2:Delete(L);break;
        case 3:Locatei(L);break;
        case 4:Locatex(L);break;
        case 5:Length(L);break;
        case 6:Display_CDLinkList(L);break;
        case 0:flag=0;printf("感谢大哥的使用\n");break;
        }
    }while (flag==1);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值