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 }