数据结构习题分析:已知由一个线性链表表示的线性表中含有三类字符的数据元素,是编写算法将该线性表分割为三个循环链表,其中每个。。。。。
来源:互联网 发布:ubuntu 安装软件中心 编辑:程序博客网 时间:2024/05/16 16:16
题目没有说明白用什么线性表,不过由于做到这道题的时候附近的题的线性表都是循环的,所以我也用了循环链表。
大体的思路就是通过扫节点,判断是什么类型的字符,然后删除并插入对应的循环链表中,我不善于解释,注释都在代码旁给出来了,function函数就是题目要求的算法,其他函数只是辅助这个函数的运行不用看或者直接看开头的两行文字就好了,希望能帮到你
#include<stdio.h>#include<malloc.h>#include<assert.h>#define Elemtype chartypedef struct SCList{ Elemtype ch; struct SCList *next;}Node;Node* _buynode(Elemtype ch);void initial(Node **head);void push_back(Node *head,Elemtype ch);void show(Node *head);void function(Node *ha,Node *hb,Node *hc);int main(){ Node *ha; initial(&ha); printf("请构造字符类型的单循环链表,注意,要三种不同的字符(@结束)\n"); int ch; while(1) { scanf("%c",&ch); if(ch=='@') break; push_back(ha,ch); } printf("构造完成的链表>>>"); show(ha); Node *hb,*hc; initial(&hb); initial(&hc); function(ha,hb,hc); printf("分割过后的单循环链表\n"); show(ha); show(hb); show(hc); return(1);}Node* _buynode(Elemtype ch){//本算法的功能是申请一个新的节点,节点的数据域赋值为x //最后返回这个节点的指针 Node *s=(Node*)malloc(sizeof(Node)); assert(s!=NULL); s->ch=ch; s->next=NULL; return(s);}void initial(Node **head){//本算法的功能是初始化单循环链表 (*head)=(Node*)malloc(sizeof(Node)); assert((*head)!=NULL); (*head)->next=*head; (*head)->ch=0;//表长为0}void push_back(Node *head,Elemtype ch){//本算法的前提是链表已经初始化 //本算法的功能是在单循环链表的尾部插入一个新的节点 //并把数据域赋值为ch Node *s=_buynode(ch); Node *p=head; while(p->next!=head) p=p->next;//p指向链表的尾部节点 s->next=p->next; p->next=s; head->ch++;//表长加一}void show(Node *head){//本算法的前提是单循环链表至少有一个节点 //本算法的功能是依次显示单循环链表中的数据元素 if(head->ch==0) return;//表长合法性判断 Node *p=head; while(p->next!=head) { printf("%c-->",p->next->ch); p=p->next; } printf("head.\n");}void function(Node *ha,Node *hb,Node *hc){//本算法的前提是三个链表已经初始化,并且a链表至少有三个不同的字符数据 //本算法的功能是把链表a分割成三个链表a,b,c //a中存储其他字符,b,c中分别存储数字字符和字母字符 Node *pa=ha; while(pa->next!=ha) { if(pa->next->ch<='9' && pa->next->ch>='0') { Node *q=pa->next; pa->next=q->next;//将数字字符的节点从a链表中摘下来 Node *pb=hb->next; while(pb->next!=hb) pb=pb->next;//pb指向b链表中的尾节点 q->next=pb->next; pb->next=q;//尾部插入 hb->ch++;//表长加一 } else if(pa->next->ch<='Z'&&pa->next->ch>='A' || pa->next->ch<='z'&&pa->next->ch>='a') { Node *q=pa->next; pa->next=q->next;//将字符字符从a链表中摘下来 Node *pc=hc->next; while(pc->next!=hc) pc=pc->next;//pc指向c链表中的尾部节点 q->next=pc->next; pc->next=q; hc->ch++;//表长加一 } else pa=pa->next;//其他类型字符的,则pa向后移动一个节点 }}
阅读全文
0 0
- 数据结构习题分析:已知由一个线性链表表示的线性表中含有三类字符的数据元素,是编写算法将该线性表分割为三个循环链表,其中每个。。。。。
- 已知一单链表中的数据元素含有三类字符:字母、数字和其他字符。是编写算法,构造三个循环链表,使每个循环链表中只含同一类字符
- 数据结构2:线性表的链表表示和实现
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 数据结构之线性链表的算法
- 线性表的链表表示和实现
- 设以带头结点的双向循环链表表示的线性表L= (a1,a2,…,an),试写一时间复杂度O(n)的算法,将L改造为 (a1,a3,…,an,…,a4,a2)。
- 数据结构习题--线性表
- 数据结构线性表的三个属性
- 试编写一个算法,将两个有序线性表合成一个有序线性表...最好是在c++上可以直接运行出来的
- 假设利用两个线性表La和Lb分别表示两个集合A和B(即线性表中的数据元素即为集合中的成员),现要求一个新的 集合A=AUB。这就要求对线性表作如下操作:扩大线性表La,将存在于线性表Lb中而不存在于线
- 数据结构与算法系列-线性表-线性表的应用
- 数据结构之线性结构(循环链表)【三】
- 长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中所有值为X的元素
- 已知线性表中元素以值递增有序排列,并以单链表作为存储结构,设计一个算法,删除表中值相同的多余元素
- 线性循环链表
- 线性表的实现(三)循环链表
- 数据结构中线性表的基本操作-合并两个线性表-按照元素升序排列
- python机器学习案例系列教程——线性分类器
- 《算法艺术与信息学竞赛》之 排序与检索 排序 uva120
- Python基础-IO编程-读文件read-写文件write
- leetcode twoSum
- 浅谈HTTP中Get与Post的区别
- 数据结构习题分析:已知由一个线性链表表示的线性表中含有三类字符的数据元素,是编写算法将该线性表分割为三个循环链表,其中每个。。。。。
- python数字图像处理-图像噪声与去噪算法
- linux 常用操作
- 滚动条
- leetcode题解-150. Evaluate Reverse Polish Notation
- 深度学习的人脸识别
- Bootstrap Table 选中某几行,获取其数据
- Python基础-内存读数据StringIO和BytesIO
- Mysql数据库If语句的使用