双向有序循环链表

联系方式:lichunwen1987 AT qq DOT com

找工作,各种数据结构和算法问题,写个双向循环链表练习联系吧

/*带头结点顺序双向循环链表*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 10
#define N_RAND 200

typedef struct Node {
    int key;
    struct Node * pre;
    struct Node * next;
}Node, *PNode;

//初始化单个结点 
PNode IniNode(int key){
    PNode q=(PNode)malloc(sizeof(Node));
    q->key=key;
    q->next=NULL;
    q->pre=NULL;
}

//初始化循环链表,设置头结点 
void IniLink(PNode *h){
    PNode hNode=IniNode(-1);
    *h=hNode;
    //初始化头结点指向自身 
    hNode->next=hNode;
    hNode->pre=hNode; 
}  

void InsertElem(PNode *h, int key){
    PNode p=(*h)->next;
    PNode q=IniNode(key);;  //需要插入链表的结点 
        
    //判断为非空结点和插入位置 
    while(p!=*h && p->key < key){
        p=p->next;
    }   
    //插入元素 
    q->pre=p->pre;
    p->pre->next=q;
    q->next=p;
    p->pre=q;                   
}

int DelElem(PNode *h, int key){
    PNode p=(*h)->next;
    while(p!=*h && p->key!=key){
        p=p->next;
    }
    //未找到该节点 
    if(p==*h) return -1;
    else{
        p->pre->next=p->next;
        p->next->pre=p->pre;
        free(p);
        return 1;
    }     
}

void PrintLink(PNode h){
    for(PNode p=h->next;p!=h;p=p->next)
        printf("%d ", p->key);
    printf("\n");
}

int main(){
    int i,tmp; 
    PNode head;
    
    IniLink(&head);  //初始化头结点       
    srand((unsigned)time(NULL));
    for(i=0;i<N;i++){
        tmp=rand()%N_RAND;
        printf("%d ",tmp);
        InsertElem(&head,tmp);//插入结点 
    }
    printf("\n");
    PrintLink(head);
    
    int delElem;
    while(head->next != head){
        printf("请输入要删除的结点:");
        scanf("%d",&delElem); 
        if(DelElem(&head,delElem)<0)
            printf("没有%d这个结点\n",delElem);
        PrintLink(head); 
    }
    printf("链表为空,游戏结束:-)\n");
    system("pause");    
    return 0;
}


你可能感兴趣的:(双向有序循环链表)