2015.12.16 doubleLinkedList-Function

  1 #include <stdio.h>
  2 #include <stdbool.h>
  3 #include <stdlib.h>
  4 
  5 typedef struct node{
  6     struct node *previous;
  7     int age;
  8     struct node *next;
  9 }Node;
 10 
 11 //创建一个结点
 12 Node *createNode();
 13 //初始化链表
 14 void intial(Node *const pHead);
 15 //是否继续
 16 bool isContinue();
 17 //查找index对应的结点位置
 18 Node *checkIndex(Node *pHead, int index);
 19 //输出链表
 20 void show(const Node *const pHead);
 21 //插入结点
 22 void insert(Node *pHead, int index, int element);
 23 //删除结点
 24 void delete(Node *pHead, int index);
 25 
 26 int main(int argc, const char * argv[]) {
 27     //定义一个指针 指向头结点(头结点不存储数据)
 28     Node *pHead = NULL;
 29     
 30     pHead = createNode();
 31     if (pHead == NULL) {
 32         exit(EXIT_FAILURE);
 33     }
 34     
 35     intial(pHead);
 36     
 37     show(pHead);
 38     
 39     insert(pHead, 3, 99);
 40     
 41     show(pHead);
 42     
 43     delete(pHead, 3);
 44     
 45     show(pHead);
 46     
 47     return 0;
 48 }
 49 
 50 
 51 
 52 Node *createNode(){
 53     //创建一个新的结点
 54     Node *pTemp = (Node *)malloc(sizeof(Node));
 55     if (pTemp == NULL) {
 56         return NULL;
 57     }
 58     
 59     //赋初值
 60     pTemp->previous = NULL;
 61     pTemp->next = NULL;
 62     
 63     //返回
 64     return pTemp;
 65 }
 66 
 67 void intial(Node *const pHead){
 68     Node *pTail = pHead;
 69     
 70     //添加保存数据的结点
 71     while (1) {
 72         Node *pTemp = createNode();
 73         if (pTemp == NULL) {
 74             exit(EXIT_FAILURE);
 75         }
 76         //输入数据
 77         printf("Please input age:");
 78         scanf("%d", &pTemp->age);
 79         
 80         //判断需要添加的位置
 81         if (pHead->next == NULL) {
 82             //头指针指向第一个结点
 83             pHead->next = pTemp;
 84             
 85             //第一个结点的previous指针指向头结点
 86             pTemp->previous = pHead;
 87             
 88             //第一个结点的next指针指向头指针
 89             pTemp->next = pHead;
 90             
 91             //头指针的previous指向第一个结点
 92             pHead->previous = pTemp;
 93             
 94             //尾指针指向第一个结点
 95             pTail = pTemp;
 96         } else{
 97             //前面的结点已经存在了
 98             //让尾结点的next指向新建的结点
 99             pTail->next = pTemp;
100             
101             //新建结点的previous指针指向尾结点
102             pTemp->previous = pTail;
103             
104             //pTail指向新建的结点
105             pTail = pTemp;
106             
107             //尾结点的next指针指向头结点
108             pTail->next = pHead;
109             
110             //头结点的previous指针指向尾结点
111             pHead->previous = pTail;
112         }
113         //询问是否继续
114         if (isContinue() == false) {
115             break;
116         }
117     }
118     
119     
120 }
121 
122 bool isContinue(){
123     char option;
124     do {
125         getchar();
126         printf("Is continued(y/n):");
127         option = getchar();
128     } while (option != 'y' && option != 'n');
129     
130     if (option == 'y') {
131         return true;
132     } else{
133         return false;
134     }
135 }
136 
137 void show(const Node *const pHead){
138     Node *pTemp = pHead->next;
139     
140     while (pTemp != NULL) {
141         printf("%d ", pTemp->age);
142         pTemp = pTemp->next;
143         
144         if (pTemp == pHead) {
145             break;
146         }
147     }
148     printf("
");
149 }
150 
151 Node *checkIndex(Node *pHead, int index){
152     Node *pTemp = pHead->next;
153     
154     while (index > 0) {
155         if (pTemp == pHead) {
156             //结点数少于index
157             break;
158         } else{
159             pTemp = pTemp->next;
160         }
161         index --;
162     }
163     if (index > 0) {
164         return NULL;
165     } else{
166         //让pTemp指向上一个结点(因为while循环中『指过了』)
167         pTemp = pTemp->previous;
168         return pTemp;
169     }
170 }
171 
172 void insert(Node *pHead, int index, int element){
173     //首先应该获取到index对应的结点地址
174     Node *pIndex = checkIndex(pHead, index);
175     
176     if (pIndex == NULL) {
177         printf("相应的元素不存在
");
178         exit(EXIT_FAILURE);
179     } else{
180         //在index前插入一个指针,并且为这个指针分配内存
181         Node *pNew = createNode();
182         
183         if (pNew == NULL) {
184             exit(EXIT_FAILURE);
185         } else{
186             pNew->age = element;
187             
188             //pNew的next指针指向pIndex
189             pNew->next = pIndex;
190             
191             //pNew的previous指针指向pIndex前面的那个结点的地址
192             pNew->previous = pIndex->previous;
193             
194             //pIndex前面的那个结点的next指针指向pNew
195             pIndex->previous->next = pNew;
196             
197             //pIndex的previous指针指向pNew
198             pIndex->previous = pNew;
199         }
200     }
201 }
202 
203 void delete(Node *pHead, int index){
204     //获取到index对应的结点
205     Node *pIndex = checkIndex(pHead, index);
206     
207     if (pIndex == NULL) {
208         exit(EXIT_FAILURE);
209     } else{
210         //pIndex前面结点的next指针指向pIndex后面的结点
211         pIndex->previous->next = pIndex->next;
212         
213         //pIndex后面结点的previous指针指向pIndex前面的结点
214         pIndex->next->previous = pIndex->previous;
215         
216         //释放pIndex结点
217         free(pIndex);
218     }
219 }
原文地址:https://www.cnblogs.com/immustard/p/5052016.html