双向链表和循环双向链表的一些简单操作集

来源:互联网 发布:unity3d 游戏版本号 编辑:程序博客网 时间:2024/06/16 18:34

双向链表

  • int inseser_debut_liste(Liste *list, int valeur) //插头
  • int inseser_fin_liste(Liste *list, int valeur) //插尾
  • int supprimer(Liste*list,int position) //删除
typedef struct Element{    int valeur;    struct Element *suivant;    struct Element *precedent;}Element;typedef struct Liste{    Element *tete;   //头    Element *queue;  //尾    int taille;     //元素个数}Liste;int inseser_debut_liste(Liste *list, int valeur) //插头{    Element *p=malloc(sizeof(Element));    if(p==NULL) return -1;    p->valeur=valeur;    if(list->tete)        list->tete->precedent=p;    else        list->queue=p;    p->suivant=list->tete;    list->tete=p;    p->precedent=NULL;    list->taille++;    return 0;}int inseser_fin_liste(Liste *list, int valeur) //插尾{    Element *p=malloc(sizeof(Element));    if(p==NULL) return -1;    p->valeur=valeur;    if(list->queue)        list->queue->suivant=p;    else        list->tete=p;    p->precedent=list->queue;    list->queue=p;    p->suivant=NULL;    list->taille++;    return 0;}int supprimer(Liste*list,int position){    int k=1;    if(list->nb==0||position<=0||position>list->taille)        return -1;    Element *p=list->tete;    while(k<position)    {        p=p->suivant;        k++;    }    if(p->precedent)        p->precedent->suivant=p->suivant;    else        list->tete=p->suivant;    if(p->suivant)        p->suivant->precedent=p->precedent;    else        list->queue=p->precedent;    list->taille--;    free(p);}
循环双向链表
建立哨兵sentinelle的双向列表
  • T_list * Creer_list()  //创建list
  • void Inserer_Tete(T_list *l, int x) //插头
  • void Inserer_Queue(T_list *l, int x)  //插尾
  • void Print_list(T_list *l)
  • void Supprimer_Cellule(T_cell *c)  //删除单元
  • T_cell *Chercher_Val(T_list *l, int val)  //查找
  • void Supprimer_Val(T_list *l, int val) 
  • int Liste_Vide(T_list *l) //判断是否为空
Figure1:插头Figure2:插


typedef struct cellule{    int clé;    struct cellule *succ;    struct cellule *pred;}T_cell;typedef struct liste{    T_cell *sentinelle;}T_list;T_list * Creer_list(){    T_list *l;    T_cell *c;    l=(T_list *)malloc(sizeof(T_list));    c=(T_cell *)malloc(sizeof(T_cell));    l->sentinelle=c;    c->pred=c;    c->succ=c;    return(l);}void Inserer_Tete(T_list *l, int x){    T_cell *c, *sentinelle;    c=(T_cell *)malloc(sizeof(T_cell));    c->clé=x;    sentinelle=l->sentinelle;    c->succ=sentinelle->succ;    c->pred=sentinelle;    sentinelle->succ->pred=c;    sentinelle->succ=c;}void Inserer_Queue(T_list *l, int x){    T_cell *c, *sentinelle;    c=(T_cell *)malloc(sizeof(T_cell));    c->clé=x;    sentinelle=l->sentinelle;    c->succ=sentinelle;    c->pred=sentinelle->pred;    sentinelle->pred->succ=c;    sentinelle->pred=c;}void Print_list(T_list *l){    T_cell *c;    c=l->sentinelle->succ;    while(c!=l->sentinelle)    {        printf("%d ",c->clé);        c=c->succ;    }}void Supprimer_Cellule(T_cell *c){    c->pred->succ=c->succ;    c->succ->pred=c->pred;}T_cell *Chercher_Val(T_list *l, int val){    T_cell *c, *sentinelle;    sentinelle=l->sentinelle;    c=sentinelle->succ;    while((c!=sentinelle)&&(c->clé!=val))        c=c->succ;    if(c==sentinelle)        return NULL;    else        return c;}void Supprimer_Val(T_list *l, int val){    T_cell *c;    c=Chercher_Val(l,val);    if(c!=NULL)    {        Supprimer_Cellule(c);        free(c);    }}int Liste_Vide(T_list *l){    return(l->sentinelle->pred==l->sentinelle->succ);}





   

原创粉丝点击