线性表:双向链表
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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端