双向循环链表

来源:互联网 发布:linux 宕机日志 编辑:程序博客网 时间:2024/06/11 22:47

转载请注明原文地址:http://blog.csdn.net/oyhb_1992/article/details/77093452

 

01.#include<stdio.h>  02.#include<malloc.h>  03.#include<stdlib.h>  04.  05.#define MALLOC(name,type1,type2)\  06.    if(!((name) = (type1)malloc(sizeof(type2)))){\  07.        fprintf(stderr,"Insufficient_memmory");\  08.        exit(EXIT_FAILURE);\  09.    }  10.  11.typedef enum {OK,ERROR}Status;  12.typedef enum{false,true}bool;  13.typedef int elemtype;  14.typedef struct Node* lInkedlist;  15.struct Node{  16.    elemtype data;  17.    struct Node* next;  18.    struct Node* prior;     19.};  20.  21.lInkedlist Listinit(lInkedlist head);  26.unsigned int Listlength(lInkedlist head);   32.unsigned int Listlocate(lInkedlist head,elemtype e);   37.Status Listinsert(lInkedlist N,elemtype e);   43.Status Listdelete(lInkedlist head,lInkedlist N);    48.void Listtraverse(lInkedlist head);   52.bool Listempty(lInkedlist head);   56.Status Listdestory(lInkedlist head);   60.lInkedlist Listinit(lInkedlist head){  61.    MALLOC(head,lInkedlist,struct Node);  62.    head->prior = head;  /*前后节点指针都指向首节点内存地址*/63.    head->next = head;  64.    return head;  65.}  66.      67.  68.unsigned int Listlength(lInkedlist head){  69.    unsigned int length = 0;  70.    lInkedlist temp = head->next;  71.  72.    for(;temp != head;temp = temp->next){  73.        length++;  74.    }  75.    return length;  76.}  77.  78. /*首节点是0,下一个节点是1*/ 79.unsigned int Listlocate(lInkedlist head,elemtype e){  80.    unsigned int count = 0;  81.    lInkedlist temp = head->next;  82.    for(;temp != head;temp = temp->next){  83.         count++;  84.        if(e == temp->data){  85.            return count;  86.        }  87.      88.    }  89.    printf("链表中不存在该元素");  90.    return 0;  91.}  92./*随便在一个节点N插入新节点,写代码不论是插入还是删除节点精髓都在于每一个节点的前后指针都要指向其他节点的内存起始位置*/  93.Status Listinsert(lInkedlist N,elemtype e){  94.    lInkedlist temp;  95.    MALLOC(temp,lInkedlist,struct Node);  96.    temp->data = e;  97.      98.    N->next->prior = temp;  99.    temp->next = N->next;  100.    temp->prior = N;  101.    N->next = temp;      102.  103.    return OK;  104.}  105.  106.  107.Status Listdelete(lInkedlist head,lInkedlist N){      108.    if(N==head){  109.        return ERROR;  110.    }  111.      112.    N->next->prior = N->prior;    113.    N->prior->next = N->next;  114.      115.    free(N);  116.    N = NULL;  117.      118.    return OK;      119.}  120.  121. /*遍历打印链表中数据数据*/ 122.void Listtraverse(lInkedlist head){  123.    lInkedlist temp = head->next;  124.    if(head == NULL){  125.        printf("链表为空");  126.    }  127.    for(;temp != head;temp = temp->next){  128.        printf("%d\n",temp->data);  129.    }  130.}  131.  132.bool Listempty(lInkedlist head){  133.    if(head = head->next){  134.        return true;  135.    }  136.        else return false;  137.}  138.  139.Status Listdestory(lInkedlist head){  140.    lInkedlist temp = head->next;  141.    lInkedlist p;  142.    while(temp!=head){  143.        p = temp;  144.        temp = temp->next;  145.        free(p);  146.    }  147.    free(head);/*最后释放头节点内存*/  148.    free(temp);/*这句话感觉多余*/149.    head = NULL;  150.    temp = NULL;  151.  152.    return OK;  153.}  


双向循环链表:如果是空链表时则首节点的上一个节点指针,下一个节点指针都是指向首节点的内存地址的。

                         如果不是空链表时,那么首节点的前一个节点指针指向尾节点的内存地址。尾节点的下一个节点指针指向首节点的内存地址。

 

原创粉丝点击