侃侃尔雅
#include <stdio.h>#include <string.h>void main(){ int a,c,j,m,flag; char b; struct str { int a; char b; int c; }aa[100],bb[200]; printf("请输入待处理数据,以输入65535完成输入!\n"); scanf("%d",&aa[0].a); bb[0].a = aa[0].a; int i=1; do { scanf("%d%c%d",&a,&b,&c); if(a<0||a>65536||b!=':'||c<0||c>65535) { printf("ERROR INPUT!\n"); } else { aa[i].a = a; aa[i].b = b; aa[i].c = c; ++i; } } while(aa[i-1].a!= 65535); m = 1; do { flag = 0; for(j=1;j<i-1;j++) { if(aa[j].a==m) { flag = 1; break; } } if(flag==1) { bb[m].a = aa[j].a; bb[m].b = aa[j].b; bb[m].c = aa[j].c; } else { bb[m].a = m; bb[m].b = ':'; bb[m].c = 0; } m++; } while(bb[m-1].a!= aa[i-2].a); printf("\n%d",bb[0],a); j=1; do { printf("\n%d%c%d",bb[j].a,bb[j].b,bb[j].c); j++; } while(j<m); printf("\n"); }
月关宝盒
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>typedef struct node{ //这个数据结构用于存储单个比例表达式int bf;//存储比的前项,也就是冒号之前的数字int af;//存储比的后项,也就是冒号之后的数字struct node *next;//指向下一个比} node;typedef struct{//这个单链表结构用于存储所有的比node *first;//指向第一个比例项node *last;//指向最后一个比例项int cnt;//比例项的个数} list;list *init(void)//初始化单链表{list *st=malloc(sizeof(list));if (st==NULL) exit(-1);else st->cnt=0;return st;}void push_back(list *l,int bf,int af)//在单链表l的末尾插入由bf和af作为比的前后项的比例式{node *tm=malloc(sizeof(node));if (tm==NULL) exit(-1);tm->af=af;tm->bf=bf;tm->next=NULL;if (l->cnt){l->last->next=tm;l->last=tm;}else{l->first=l->last=tm;}l->cnt++;}void add(list *l,int tbf)//把以l表中最后一项的比例前项+1到tbf-1这些整数做为比例前项,0做为比例后项的比例式插入到l表中{int i,fbf;node *tm;for (i=l->last->bf+1;i<tbf;i++)push_back(l,i,0);}size_t num_len(const int a)//辅助函数,返回整数a的字符长度{char str[80];sprintf(str,"%d",a);return strlen(str);}char *toStr(list *l)//将l链表中的内容转化为可输出的字符串{char *str=malloc(sizeof(char)*3);int bn=2;node *t=NULL;if (str==NULL) exit;strcpy(str,"-1");for (t=l->first;t!=NULL;t=t->next){str=realloc(str,sizeof(char)*(bn+num_len(t->af)+num_len(t->bf)+2));if (str==NULL) exit(-1);sprintf(str+bn," %d:%d\0",t->bf,t->af);bn=strlen(str);}return str;}void FREE(list *a)//释放单链表a占用的空间{node *c,*b;for (b=a->first;b!=NULL;b=c){c=b->next;free(b);}free(a);}int main(void){char *chstr,cnstr[]="-1 5:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1";list *slist=init();int inbf,inaf,len=0;while (cnstr[len])//当cnstr字符串中还有字符未读取时继续{while(isspace(cnstr[len])) ++len;//跳过空格字符sscanf(cnstr+len,"%d",&inbf);//从cnstr[len]字符开始读取一个整数(比的前项)len+=num_len(inbf);//将刚才读取的整数的字符长度累加到len上以 确定下次sscanf()读取时的位置//len+=sscanf(cnstr+len,"%d",&inbf);if (inbf==-1)//如果读取到的是第一项(即读取到-1)就把1:0存入slist单链表push_back(slist,1,0);else//如果读取到的不是第一项(即inbf不是-1){add(slist,inbf);//将表slist中的当面末项到inbf之间缺少的项添加到表slist中while(!isdigit(cnstr[len])) ++len;//路过非数字字符,以便于后面读取比的后项sscanf(cnstr+len,"%d",&inaf),inaf;//读取比的后项。len+=num_len(inaf);//将刚才读取的整数inaf的字符长度累加到len上以确定下次sscanf()读取时的位置push_back(slist,inbf,inaf);//将cnstr字符串中的当前比式加入到表slist中}}puts(chstr=toStr(slist));//将处理完成的slist表转换为可输出的字符串,并输出FREE(slist);//释放slist占用的空间free(chstr);//释放转换后的字符串占用的空间。return 0;}