美文网首页
双向循环链表

双向循环链表

作者: 拉布拉熊 | 来源:发表于2020-04-07 20:44 被阅读0次

    一、双向循环链表的结点及数据定义

    #define ERROR0

    #define TRUE1

    #define FALSE0

    #define OK1

    #define MAXSIZE20/* 存储空间初始分配量 */

    typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */

    typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */

    //定义结点

    typedef struct Node{

        structNode*prior;//前驱

        ElemTypedata;//数据

        structNode*next;//后续

    }Node;

    typedefstructNode* LinkList;

    二、双向循环链表初始化

    Status CreateList(LinkList *L){

        *L = (LinkList)malloc(sizeof(Node));

        if(*L ==NULL) {

            returnERROR;

        }

        (*L)->next= (*L);

        (*L)->prior= (*L);

        (*L)->data= -1;

        //指向头结点

        LinkListp = *L;

    //    LinkList temp;

        for(inti=0; i<10; i++) {

            //新增数据

            LinkListtemp = (LinkList)malloc(sizeof(Node));

            if(temp ==NULL) {

                returnERROR;

            }

            temp->data= i;

            //为新增的结点建立双向链表关系

            //temp 是p的后继

            p->next= temp;

            //temp 的前驱是p

            temp ->prior= p;

            //

            temp->next= *L;

            //

            (*L)->prior= temp;

            //p 要记录最后的结点的位置,方便下一次插入

            p = p->next;

        }

    //    //最后一个结点的next指向头结点,头结点的prior指向最后一个结点

    //    p->next = *L;

    //    (*L)->prior = p;

        returnOK;

    }

    三、打印循环链表的元素


    void display(LinkList L){

        if(L ==NULL) {

            printf("打印的双向链表为空!\n");

            return;

        }

        LinkListp = L->next;

        while(p != L) {

            printf("%d ",p->data);

            p = p->next;

        }

        printf("\n");

    }

    四、双向循环链表插入元素


    /*当插入位置超过链表长度则插入到链表末尾*/

    Status LinkListInsert(LinkList *L,int index,ElemType data){

        if(*L ==NULL|| index <1) {

            returnERROR;

        }

        //指向头结点

        LinkListp = *L;

        //找到要插入的数据的前一个结点

        inti =1;

        while(inext!= *L) {

            p = p->next;

            i++;

        }

        if(i>index) {

            returnERROR;

        }

       //

        LinkList temp = (LinkList)malloc(sizeof(Node));

        if(temp ==NULL) {

            returnERROR;

        }

        temp->data= data;

        //

        temp->next= p->next;

        //最后一个结点

        if(temp->next== *L) {

            (*L)->prior= temp;

        }else{

            p->next->prior= temp;

        }

        temp->prior= p;

        //

        p->next= temp;

    //    p->next->prior = temp;

        returnOK;

    }

    五、双向循环链表删除结点

    Status deleteList(LinkList *L,int index,ElemType *data){

        if(*L ==NULL|| index <1) {

            returnERROR;

        }

        LinkListtemp = (*L)->next;

        if(*L == temp) {

            returnERROR;

        }

        inti=1;

        while(inext!= *L)) {

            temp = temp->next;

    //        NSLog(@"temp data = %d",temp->data);

            i++;

        }

        *data = temp->data;

        temp->prior->next= temp->next;

        temp->next->prior= temp->prior;

        free(temp);

        returnOK;

    }

    六、查询双向链表的数据


    ElemType SelectList(LinkList L,int index){

        if(L ==NULL|| index<1) {

            return-1;

        }

        LinkListp = L->next;

        inti=1;

        while(inext!= L) {

            p = p->next;

            i++;

        }

        if(p == L) {

            return-1;

        }

        returnp->data;

        return-1;

    }

    七、修改双向链表的数据

    Status ReplaceList(LinkList L,int index,ElemType data){

        if(L ==NULL|| index<1) {

            returnERROR;

        }

        LinkListp = L->next;

        inti=1;

        while(inext!=L) {

            p = p->next;

            i++;

        }

        if(p==L) {

            returnERROR;

        }

        p->data= data;

        returnOK;

    }

    八、调用

    intmain(intargc,constchar* argv[]) {

        LinkList L;

        CreateList(&L);

        display(L);

        inttemp,item;

        printf("输入要插入的位置和数据用空格隔开:");

        scanf("%d %d",&temp,&item);

        LinkListInsert(&L,temp,item);

        display(L);

        printf("输入要删除位置1:");

        scanf("%d",&temp);

        deleteList(&L, temp, &item);

        display(L);

        printf("输入要删除位置2:");

        scanf("%d",&temp);

        deleteList(&L, temp, &item);

        display(L);

        printf("输入要删除位置3:");

        scanf("%d",&temp);

        deleteList(&L, temp, &item);

        display(L);

        printf("输入要查询的位置1:");

        scanf("%d",&temp);

        ElemTypedata =SelectList(L, temp);

        printf("查询到的数据是:%d\n",data);

        printf("输入要查询的位置2:");

        scanf("%d",&temp);

        data =SelectList(L, temp);

        printf("查询到的数据是:%d\n",data);

        printf("输入要查询的位置3:");

        scanf("%d",&temp);

        data =SelectList(L, temp);

        printf("查询到的数据是:%d\n",data);

        //

        printf("输入要修改的位置和数据1:");

        scanf("%d %d",&temp,&item);

        ReplaceList(L,temp,item);

        display(L);

        printf("输入要修改的位置和数据2:");

        scanf("%d %d",&temp,&item);

        ReplaceList(L,temp,item);

        display(L);

        printf("输入要修改的位置和数据3:");

        scanf("%d %d",&temp,&item);

        ReplaceList(L,temp,item);

        display(L);

        return0;

    }

    相关文章

      网友评论

          本文标题:双向循环链表

          本文链接:https://www.haomeiwen.com/subject/drsophtx.html