日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

双向循环链表:字母表实现前后移动

發布時間:2025/3/15 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 双向循环链表:字母表实现前后移动 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述


要求實現用戶輸入一個數使得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; }

運行結果






新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

總結

以上是生活随笔為你收集整理的双向循环链表:字母表实现前后移动的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。