ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1.4 双向循环链

2019-05-03 20:39:16  阅读:242  来源: 互联网

标签:1.4 p2 head p1 next prior 循环 双向 DNode


// 该程序使用带头结点的双向循环链表
// 交换节点进行排序

//补充:locate & Insert

#include <stdio.h>
#include <stdlib.h>

typedef struct _Node{
    int data;
    struct _Node *next;
    struct _Node *prior;
}DNode;

DNode *createList(){
    DNode *head=(DNode *)malloc(sizeof(DNode));
    head->next=head->prior=head;
    return head;
}

//头是固定的使用头插法比较方便
void insertList(DNode *head,int data){
    DNode *p=(DNode *)malloc(sizeof(DNode));
    p->data=data;

    p->next=head->next;         //先改变p的指向,不影响原链表的指向关系
    p->prior=head;

    p->prior->next=p;              //利用已有的双向关系进行修改
    p->next->prior=p;
}

void traverseDList(DNode *head){
    DNode *p=head->next;
    DNode *p2=NULL;
    printf("Traverse:");
    while(p!=head){
        printf("%d ",p->data);
        p2=p;
        p=p->next;
    }
    printf("\n");

    //Reverse
#if 1
    printf("Reverse:");
    while(p2!=head){
        printf("%d ",p2->data);
        p2=p2->prior;
    }
    printf("\n");
#endif
}

void searchElem(DNode *head,int n){
    DNode *p=head->next;
    int flag=0;
    while(p!=head){
        if(p->data==n){
            flag=1;
            printf("Find elem addr:%p\n",p);
        }
        p=p->next;
    }
    if(!flag){
        printf("Can not find elem %d !",n);
    }
}

int deleteElem(DNode *head,int n){
    DNode *p1=head->next;
    DNode *p2=head;
    while(p1!=head){
        if(p1->data==n){
            //delete elem
            p2->next=p1->next;
            p1->next->prior=p2;
            free(p1);
            printf("delete %d !\n",n);
            return 1;
        }
        p2=p1;
        p1=p1->next;
    }
    return 0;
}

void swapNode(DNode *p2,DNode *p1){  //交换p2和它的下一个节点
    p2->prior->next=p1;
    p2->next=p1->next;
    p1->next=p2;
    
    p1->prior=p2->prior;
    p2->next->prior=p2;
    p2->prior=p1;
}

#if 1
int listNESort(DNode *head){         //先按从大到小排。小的(上浮)至尾部
    int flag;
    DNode *p1,*p2;
    p1=head->next;
    for(p1=p1->next;p1!=head;){
        flag=1;
        for(p2=head->next;p2!=p1;p2=p2->next){
            if((p2->data) > (p2->next->data)){
                swapNode(p2,p2->next);

                flag=0;

                if(p1->next==p2)              //交换p2和p2->next后,p1位置可能也变了
                    p1=p1->next;                //先把p1换回去,恢复p1在前p2在后
                p2=p2->prior;                   //p2退回去
                //traverseDList(head);   
            }
        }
        if(flag)p1=p1->next;
                //printf("2.p2:%d ,p1:%d\n",p2->data,p1->data); 
    }
}
#endif

//void listDESort(DNode *head){  //Excheange Data
//}

int main(){
    DNode *head=createList();
    int i;
    for(i=1;i<=10;i++){
        insertList(head,i);
    }
#if 0
    insertList(head,1);
    insertList(head,3);
    insertList(head,5);
    insertList(head,7);
    insertList(head,2);
    insertList(head,4);
    insertList(head,6);
    insertList(head,8);
#endif
#if 0
    int find=7;
    searchElem(head,find);

    deleteElem(head,5);
    traverseDList(head);
#endif

#if 0
    DNode *p=head->next;
    p=p->next;
    p=p->next;
    swapNode(p,p->next);
#endif

    listNESort(head);
    traverseDList(head);
    return 0;
}

 

标签:1.4,p2,head,p1,next,prior,循环,双向,DNode
来源: https://www.cnblogs.com/Alexagender/p/10806243.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有