链表的分解
来源:互联网 发布:人工智能客服开源系统 编辑:程序博客网 时间:2024/05/16 10:54
已知L为无头结点单链表中第一个结点的指针,每个结点数据域存放一个字符,该字符可能是英文字母字符或数字字符或其它字符,编写算法构造三个以带头结点的单循环链表表示的线性表,使每个表中只含同一类字符。(要求用最少的时间和最少的空间)
#include<stdio.h>#include<stdlib.h>#include<time.h>typedef struct Node{ char data; struct Node *next;}linklist;/*功能:随机生成一个长度为 n 无头节点的链表 输入:链表的长度 返回:链表的第一个创立节点的地址*/linklist *autoCreate(int n){ linklist *first=NULL,*cur,*p; int i; char ch; srand(time(NULL)); //设置时间种子 for(i=0;i<n;i++) { p=(linklist*)malloc(sizeof(linklist)); p->next=NULL; ch=rand()%128; p->data=ch; if(first==NULL) { first=p; cur=first; } else { cur->next=p; cur=p; } } return first;}/*功能:输出链表字符 输入:链表的头指针 输出:链表数据域的字符*/void disp(linklist *head){ linklist *p=head->next; while(p!=head) { printf("%c",p->data); p=p->next; } printf("\n");}/*释放循环链表的申请空间*/void _clear(linklist *head){ linklist *p=head->next; while(p!=head) { head->next=p->next; free(p); p=head->next; } free(head);}/*功能:判断一个字符是 英文字母 、数字、还是其余字符 分别返回 1 2 3*/int get_attribute(char ch){ if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { return 1; } else if(ch>='0'&&ch<='9') { return 2; } else { return 3; }}/*功能:将一个无头节点,数据域为 char 的循环链表分解为 字母、数字、其余三个有头节点链表、并printf 输入:无需输入,字符有电脑随机生成 输出:电脑随机生成的字符、三个子链表的字符*/ void partition_linklist() { int n,i; linklist *first,*pnumber,*pletter,*pdefault,*p,*p1,*p2,*p3; printf("请输入字符的个数:"); scanf("%d",&n); first=autoCreate(n); p1=pletter=(linklist*)malloc(sizeof(linklist)); p2=pnumber=(linklist*)malloc(sizeof(linklist)); p3=pdefault=(linklist*)malloc(sizeof(linklist)); p1->next=p1; p2->next=p2; p3->next=p3; printf("未分拆时字符:"); p=first; while(p) { printf("%c",p->data); p=p->next; } printf("\n"); p=first; while(p) //分拆链表,建立三个循环链表 { i=get_attribute(p->data); switch(i) { case 1: { p1->next=p; p=p->next; p1=p1->next; p1->next=pletter; break; } case 2: { p2->next=p; p=p->next; p2=p2->next; p2->next=pnumber; break; } case 3: { p3->next=p; p=p->next; p3=p3->next; p3->next=pdefault; break; } } } printf("英语字母:"); //输出三个链表的数据域 disp(pletter); printf("数字:"); disp(pnumber); printf("其余字符:"); disp(pdefault); _clear(pletter); //释放空间 _clear(pnumber); _clear(pdefault); } int main() { partition_linklist(); return 0; }
0 0
- 链表的分解
- 0201 链表操作的分解
- 尾插法建立链表分解
- 数的分解、分解质因数
- 5. 矩阵的LU分解、QR分解
- ##剑指offer 4.4 分解简化问题1-复杂链表的复制
- 剑指offer 26题 【分解让复杂问题简单】复杂链表的复制
- 剑指offer:(26)分解让复杂问题简单化 :复杂链表的复制
- 《剑指offer》刷题笔记(分解让复杂问题简单):复杂链表的复制
- C项目的分解
- 乘积最大的分解
- 数的分解
- 过程分解的必要性
- MATLAB的LU分解
- 3nf的分解
- 结婚的WBS分解
- 排列的分解
- 分解质因数的问题
- PHP回调函数的实现方法 处理事件
- 数的读法
- iOS之代理delegate使用
- ubuntu ftp服务器
- Spark 安装
- 链表的分解
- 线程安全之ConcurrentHashMap
- MySQL基本命令行&MySql外键设置详解
- 类的生命周期
- UVA-350 - Pseudo-Random Numbers
- iOS获取键盘的高度
- 联想保修时间查询
- 透过Xamarin撰写一致性的Web资料擷取开发方式 - iOS篇
- tcp流量控制