题目:
```c
//5个函数???
typedef struct{
ElemType list[MaxSize];
int size;
}SequenceList; //将struct 某某类型,自定义成 SequenceList
SequenceList L; //SequenceList的变量名
/*顺序表的初始化*/
void ListInitialize(SequenceList *L) //一定要用指针参数,其会自动传回到主函数
{
L->size=0;
}
int ListLength(SequenceList L)
{
return L.size;
}
/*在顺序表L的位置i前插入数据元素x,插入成功则返回1,失败则返回0*/
int ListInsert(SequenceList *L,int i,ElemType x)
{
int j;
if(L->size>=MaxSize)
{
printf("顺序表已满无法插入!\n");
return 0;
}
else if(i<0||i>L->size)
{
printf("参数i不合法:\n");
return 0;
}
else
{
/*for(j=L->size;j>i;j--) //从最后开始往前后退
{
L->list[j]=L->list[j-1]; //其实,读到后面我们就能知道为什么要用指针了,这样方便传递,不用再用return了但是,这个不是在前面吗,我在想想
} */ //????
L->list[i]=x;
L->size++;//这个加加,和前面不能换位置
return 1;
}
}
int ListGet(SequenceList L,int i,ElemType *x) //注意:只是取值,不用动顺序表里面的东西,否则就像删除数据了
{
if(i<0||i>ListLength(L)-1) //为什么不能用i>L.size-1
{
printf("参数i不合法:\n");
return 0;
}
else
{
*x=L.list[i];
return 1;
}
}
int ListFind(SequenceList L,char x)
{
int i;
for(i=0;iif(L.list[i].name==x)
{
return i;
break; //找到了就不要继续找下去,如果继续找下去是返回i还是-1 ???
}
else
return -1;
}
}
主函数代码:
//这是一个利用顺序表来实现的病人病历管理系统
#include
#include
#define MaxSize 101 //这个是宏定义
typedef struct
{
char number[5];
char name[20];
char symptom[50];
} patient;
typedef patient ElemType; //struct patient结构里面所有的变量类型定义为ElemType类型
#include"SequenceList.h" //如果这里空格会怎样 ???
int main()
{
int n;
patient s; //定义 结构体变量,难道不能用ElemType s;??? 所以这里是不可以的
SequenceList mylist; //对应了那些函数的参数类型都是SequenceList
int i,j;
ListInitialize(&mylist); //再看看函数传递???
printf("病人数量:");
scanf("%d",&n);
for(i=0;iprintf("请输入第%d个病人的信息:\n",i+1);
scanf("%s%s%s",s.number,s.name,s.symptom);
ListInsert( &mylist,i, s); //s里的所有东西插入到顺序表中
}
printf("请输入需要查找病人的名字:\n");
scanf("%s",s.name) ;
j=ListFind(L,s.name);//存在的话返回的是和x相等的数据元素的序号
printf("查找的病人在顺序表是第几个:%d\n",j);
ListGet(L,j,&s);
printf("%s %s %s ",s.number,s.name,s.symptom);
return 0;
}
测试结果:
奇怪的点:
1.返回的j值总是0,不是和代码那样,返回的是对应的哪个数
2.提取信息那里,不管j是否在范围内,总是会先打印“参数不合法”
3.取出来的信息只有名字是对的,无论是何种情况取出来的信息中,序号和症状总是顺序表最后一个信息里的序号和症状。
希望指出代码问题,非常感谢!
#include <stdio.h>
#include <string.h>
char mystr[2000]; //应为我最后要强制改格式 所以用字符数组来存
int m;
int min=0;
int findT(int n){
int i=0,j,k,sum=0;
char a[100000];
k=n;
if(n==2||n==1|| n==0) return ;
while(n){ // 二进制表示形式
if(n%2==0) a[i]='0';
else a[i]='1';
n/=2;
i++;
}
if(k!=m) strcat(mystr,"2(");
for(j=i-1;j>=0;j--)
{
if(a[j]=='1')
{
if(j==2) strcat(mystr,"2(2)");
if(j==2&&(a[1]=='1'||a[0]=='1')) strcat(mystr,"+"); //判断是否应该加+号
if(j==1)strcat(mystr,"2");
if(j==1&&a[0]=='1') strcat(mystr,"+");
if(j==0)strcat(mystr,"2(0)");
findT(j);
}
}
if(k!=m)strcat(mystr,")");
if(k!=m)strcat(mystr,"+");
}
int main(){
int n,i;
scanf("%d",&n);
m=n;
if(n==0) strcat(mystr,"0"); // 临界条件 可以不用考虑
if(n==1) strcat(mystr,"2(0)");
if(n==2) strcat(mystr,"2");
if(n>=3)
findT(n);
for(i=0;i<strlen(mystr);i++){ // 强制修正输出格式
if(i==strlen(mystr)-1&&mystr[i]=='+') continue;
if(mystr[i]=='+'&&mystr[i+1]==')') continue;
printf("%c",mystr[i]);
}
return 0;
}