双向循环链表:字母表实现前后移动
生活随笔
收集整理的這篇文章主要介紹了
双向循环链表:字母表实现前后移动
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述
要求實現用戶輸入一個數使得26個字母的排列發生變化,例如用戶輸入3,使得結果為:DEFHIJKLMNOPQRSTUVWXYZABC,
同時需要支持負數,使得輸入-3時,結果為:XYZABCDEFGHIJKLMNOPQRSTUVW。實現位置的前后都能移動且數據都是連著的,當然數據結構選擇雙向循環鏈表啦。
問題拓展
問題實際上是有關凱撒密碼,凱撒密碼的思想是通過把字母移動一定的位數來實現加密和解密。
明文中的所有字母都在字母表上向后(或向前)按照一個固定數目進行偏移后被替換成密文。
代碼展示
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #define OK 1 #define ERROR 0typedef int Status; typedef char EleType; //雙向循環鏈表 結點數據結構 typedef struct DulNode {EleType data;//數據域struct DulNode* next;//后繼結點指針域struct DulNode* prior;//前驅結點指針域 }DulNode,*DulLinkList; //取了別名 DulNode* 相當于DulLInkList//創建雙向循環鏈表 Status CreatDulLink(DulLinkList* list) {if (list == NULL){return ERROR;}DulNode* head = (DulNode*)malloc(sizeof(DulNode));//創建頭結點if (head == NULL){return ERROR;}DulNode* p = head;//p 移動指針,起初指向頭結點p->next = p->prior = NULL;for (size_t i = 0; i < 26; i++){DulNode* node = (DulNode*)malloc(sizeof(DulNode));//創建結點node->data = 'A' + i;//下面3步將創建的node結點放到雙向循環鏈表中node->next = p->next;//直接賦值NULL也可以node->prior = p;p->next = node;//p 始終指向鏈表最后一個結點p = node;}//下2步 將尾結點和第一個結點關聯形成雙向循環鏈表,越過頭結點。p->next = head->next;head->next->prior = p;//循環鏈表指向第一個元素*list = p->next;//釋放頭結點free(head);return OK; } //將循環鏈表指向第num個位置 Status Caesar(DulLinkList* list,int num) {DulLinkList tmp = *list;//雙向循環鏈表指針往后移if (num > 0){int i = 0;//num = 1 往后移動1位, temp = temp -> nextwhile (i < num){tmp = tmp->next;i++;}*list = tmp;}//雙向循環鏈表指針往前移if (num < 0){int i = 0;//num = -1 往前移動1位,temp = temp->priorwhile (i < num*-1){tmp = tmp->prior;i++;}*list = tmp;}return OK; } //銷毀鏈表釋放內存 Status DestroyDulLink(DulLinkList list) {if (list == NULL){return ERROR;}DulNode* node = list;//node為移動指針,node 開始指向循環鏈表第一個結點//循環鏈表遍歷完判斷,尾結點的指針域指向第一個結點while (node->next != list){DulNode* temp = node;node = node->next;free(temp);}//釋放最后一個結點free(node);return OK; } //循環鏈表展示 Status ShowCaesar(DulLinkList list) {if (list == NULL){return ERROR;}DulNode* node = list;//node為移動指針,node 開始指向循環鏈表的開始的一個結點//循環鏈表遍歷完判斷,尾結點的next指針域指向開始第一個結點while (node->next != list){printf("%c",node->data);node = node->next;}printf("\n");return OK; }int main(int argc, char *argv[]) {DulLinkList list = NULL;CreatDulLink(&list);DulLinkList origal = list;int num = 0;while (1){list = origal;printf("請輸入位移數字(0退出):");scanf("%d", &num);if (!num){break;}Caesar(&list, num);ShowCaesar(list);}DestroyDulLink(list);return 0; }
運行結果
總結
以上是生活随笔為你收集整理的双向循环链表:字母表实现前后移动的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET MVC 2 学习笔记二:
- 下一篇: 关于年会抢红包游戏的一个思考