线性表:双向链表
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 }