线性表:双向链表

  1 //双向链表的结构
  2 typedef struct DualNode
  3 {
  4     Elemtype data;
  5     struct DualNode *prior; //前驱结点 
  6     struct DualNode *next;  //后继结点 
  7 } DualNode,*DuLinkList;
  8 //双向链表的插入 
  9 Status ListInsert_DuL(DuLinkList &L,int i,ElemType)
 10 {//在带头结点的双向链表L中第i个位置之前插入元素e 
 11     if(!(p = GetElem_DuL(L,i)))//在L中确定第i个元素的位置指针p 
 12     return ERROR; //p = NULL,则第i个元素不存在啊
 13     s = new DulNode;  //生成新结点s 
 14     s->data = e; //赋值 
 15     s->prior = p->prior;//让s的前指针指向p的前结点 
 16     p->prior->next = s; //让p的前结点的后指针指向s 
 17     s->next = p;        //s的后指针指向p 
 18     p->prior = s;       //p的前指针指向s 
 19     return OK; 
 20 }
 21 //双向链表的删除
 22 Status ListDelete_DuL(DuLinkList &L,int i) 
 23 {
 24     if(!(p = GetElem_DuL(L,i))) //在L中确定第i个元素的位置p 
 25     return ERROR;              //当p为NULL第i个元素不存在 
 26     p->prior->next = p->next;   //让p的前结点的后指针指向p的后结点 
 27     p->next->prior = p->prior; //让p的后结点的前指针指向p的前结点 
 28     
 29     delete p;                   //释放空间 
 30     return OK; 
 31 }
 32 
 33 指过来指过去线性表终于结束了
 34 
 35 
 36 //双向循环链表的实践
 37 26个字母A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
 38 输入3   D E F G H I J K L M N O P Q R S T U V W X Y Z A B C 
 39 输入-3  X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
 40 #include<stdio.h>
 41 #include<stdlib.h>
 42 
 43 #define OK 1
 44 #define ERROR 0
 45 
 46 typedef char ElemType; //数据类型 
 47 typedef int  Status;   //状态返回码 
 48 
 49 typedef struct DualNode
 50 {
 51     ElemType data;
 52     struct DualNode *prior;
 53     struct DualNode *next;
 54 }DualNode,*DuLinkList;
 55 
 56 Status InitList(DuLinkList *L) //初始化 
 57 {
 58     DualNode *p,*q;
 59     int i;
 60     
 61     *L = (DuLinkList)malloc(sizeof(DualNode));
 62     if(!(*L))
 63     {
 64         return ERROR;
 65     }
 66     
 67     (*L)->next = (*L)->prior = NULL;
 68     p = (*L); //p暂时是头结点 头指针 
 69     
 70     for(i=0; i < 26; i++)
 71     {
 72         q = (DualNode *)malloc(sizeof(DualNode));
 73         if(!q)
 74         {
 75             return ERROR;
 76         } 
 77         
 78         q->data = 'A'+i;
 79         q->prior = p;
 80         q->next = p->next;
 81         p->next = q;
 82         
 83         p = q;  //p成为下一个结点 
 84     }
 85     
 86     p->next = (*L)->next; //让其变成循环 
 87     (*L)->next->prior = p;
 88     
 89     return OK;
 90 }
 91 
 92 void Caesar(DuLinkList *L,int i)
 93 {
 94     if(i > 0)
 95     {
 96         do
 97         {
 98             (*L) = (*L)->next;
 99         }while(--i);
100     }
101     
102     if(i < 0)
103     {
104         i=i-1;  //先进入链表 不然最初头结点L的prior指向NULL
105         (*L)=(*L)->next;
106         do
107         {
108             (*L)=(*L)->prior;
109         }while(++i);
110     }
111 }
112 
113 int main(void)
114 {
115     DuLinkList L;
116     int i,n;
117     
118     InitList(&L);
119     printf("请输入一个整数:");
120     scanf("%d",&n);
121     printf("\n"); 
122     Caesar(&L,n);
123     
124     for(i = 0; i < 26; i++)
125     {
126         L = L->next;
127         printf("%c",L->data);
128     }
129     return 0;
130 }
原文地址:https://www.cnblogs.com/ZhengLijie/p/12491204.html