2 回答
TA贡献1801条经验 获得超15个赞
#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");
}
TA贡献1772条经验 获得超5个赞
#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;
}
- 2 回答
- 0 关注
- 98 浏览
添加回答
举报