数据结构上机3——循环链表
来源:互联网 发布:linux if语句使用方法 编辑:程序博客网 时间:2024/06/05 16:00
循环链表的基本操作:
#include<stdio.h> #include<stdlib.h> typedef char ListData;typedef struct dnode { ListData data; struct dnode * prior, * next; } DblNode;typedef DblNode * DblList;void CreateDblList ( DblList & first ) { printf("请输入字符:") ; first = ( DblNode * ) malloc ( sizeof ( DblNode ) ); if ( first == NULL ) { printf ( "存储分配错!\n" ); exit (1); } first->prior = first->next = first; //表头结点的链指针指向自己 ListData data; DblNode *q; while(scanf("%c",&data)){ q = ( DblNode * ) malloc ( sizeof ( DblNode ) ); q->data=data; q->prior = first->prior; q->next = first; first->prior->next=q; first->prior=q; if(getchar()=='\n') break; }}DblNode *Locate (DblList first, int i){//查找 DblNode * p = first->next; int count = 0; if(i==0) return first; while ( p != first ) { if(count+1==i) return p; count++; p = p->next; } printf("error"); return p;}int Insertforth ( DblList first, int i, ListData x ) { DblNode * p = Locate ( first, i-1 ); //指针定位于插入位置前驱 if ( p == first && i != 1) return 0; DblNode * q = ( DblNode * ) malloc ( sizeof ( DblNode ) ); //分配结点 q->data = x; q->prior = p; p->next->prior = q; //在前驱方向链入新结点 q->next = p->next; p->next = q; //在后继方向链入新结点 return 1;}int Insertback ( DblList first, int i, ListData x ) { DblNode * p = Locate ( first, i ); //指针定位于插入位置后继 if ( p == first && i != 0) return 0; DblNode * q = ( DblNode * ) malloc ( sizeof ( DblNode ) ); //分配结点 q->data = x; q->prior = p->prior; p->prior->next = q; //在前驱方向链入新结点 q->next = p; p->prior = q; //在后继方向链入新结点 return 1;}/**/int Length ( DblList first ) {//计算带表头结点的双向循环链表的长度 DblNode * p = first->next; int count = 0; while ( p != first ) { printf("%c ",(p->data)); p = p->next; count++; } return count;} int Removeforth ( DblList first, int i ) { DblNode * q = Locate ( first, i ); DblNode * p = Locate ( first, i-1 ); //指针定位于删除结点位置前 p->next = p->next->next; p->next->prior = p; //删除结点 free ( q ); //释放 return 1;}int Removeback ( DblList first, int i ) { DblNode * q = Locate ( first, i ); DblNode * p = Locate ( first, i+1 ); //指针定位于删除结点后继 if ( p == first ) return 0; p->prior = p->prior->prior; p->prior->next = p; //删除结点 free ( q ); //释放 return 1;}/**/int Remove ( DblList first, int i ) { DblNode * p = Locate ( first, i ); //指针定位于删除结点位置 if ( p == first ) return 0; p->next->prior = p->prior; p->prior->next = p->next; //删除结点 p free ( p ); //释放 return 1;}int main(){ DblList first; int length; CreateDblList(first);//创建 length=Length(first); printf("%d ",length); puts(""); printf("%d ",Insertforth(first,2,'b'));//工作指针在插入位前驱 length=Length(first); puts(""); printf("%d ",Insertback(first,2,'e'));//工作指针在插入位后继 length=Length(first); puts(""); printf("%d ",Remove(first,1));//删除1号位 length=Length(first); puts(""); printf("%d ",Removeforth(first,1));//工作指针在插入位前驱 length=Length(first); puts(""); printf("%d ",Removeback(first,1));//工作指针在插入位后继 length=Length(first); return 0;}
#include<stdio.h> #include<stdlib.h> typedef char ListData;typedef struct dnode { ListData data; struct dnode * prior, * next; } DblNode;typedef DblNode * DblList;void CreateDblList ( DblList & first ) { printf("请输入字符:(5个左右,中间用一个空格隔开)") ; first = ( DblNode * ) malloc ( sizeof ( DblNode ) ); if ( first == NULL ) { printf ( "存储分配错!\n" ); exit (1); } first->prior = first->next = first; //表头结点的链指针指向自己 ListData data; DblNode *q; while(scanf("%c",&data)){ q = ( DblNode * ) malloc ( sizeof ( DblNode ) ); q->data=data; q->prior = first->prior; q->next = first; first->prior->next=q; first->prior=q; if(getchar()=='\n') break; }}DblNode *Locate (DblList first, int i){//查找 DblNode * p = first->next; int count = 0; if(i==0) return first; while ( p != first ) { if(count+1==i) return p; count++; p = p->next; } printf("error"); return p;}int Length ( DblList first ) {//计算带表头结点的双向循环链表的长度 DblNode * p = first->next; int count = 0; while ( p != first ) { printf("%c ",(p->data)); p = p->next; count++; } return count;} int main(){ DblList first; int length,n; CreateDblList(first);//创建 length=Length(first); printf("%d ",length); puts(""); printf("请输入一个数字n,我们将输出第n位的前驱和后继,注意n的大小:\n"); scanf("%d",&n); if(n<2||n>length) {printf("错误"); return 0;} printf("%c %c",Locate(first,n)->prior->data,Locate(first,n)->next->data); puts(""); return 0;}
阅读全文
0 0
- 数据结构上机3——循环链表
- 数据结构上机1——线性表
- 数据结构C#——循环链表
- 数据结构——单向循环链表
- 数据结构——循环链表
- 数据结构——循环链表
- 数据结构与算法—循环链表
- Linux C 数据结构—-循环链表
- 数据结构—链表-循环链表
- 数据结构上机——栈
- 数据结构上机——队列
- 数据结构上机——数组
- 数据结构(3)--循环链表
- 数据结构 循环链表
- 数据结构-循环链表
- 数据结构----循环链表
- 数据结构--循环链表
- 【数据结构】循环链表
- 匿名内部类为什么是 Final 的呢?
- 关于C#winform中tableLayoutPanel动态删除和动态加载一行
- 进程间通讯—消息队列
- Tensorflow学习之逻辑回归的实现
- 数据库锁机制 很详细的教程,易懂
- 数据结构上机3——循环链表
- 英语之介词规则
- shell 交换stderr stdout 3>&1 1>&2 2>&3
- iOS11 [[UIApplication sharedApplication].windows lastObject]
- Java中的值传递和引用传递
- μC/OS实时操作系统简单介绍
- Android开发学习资料
- 《MFC游戏开发》笔记二 建立工程、调整窗口
- Another Keras Tutorial For Neural Network Beginners