一定的功能。
2存储不定个数的数值用可变数组存储或链表实现。
一直输入数据,然后当输入一个特定的值后停止输入。
例:
cin>>i;
while(i!=-1)//当输入-1停止输入
{
把数据加入链表或可变数组;
cin>>i;
}
3求N个数的最大公约数相当于先求俩个数的最大公约数,再用这个最大公约数与第三个数求最大公约数,一直求到最后一个数。
可以减少表的空余字段,减少拆表的必要,例如用户集合可以一条记录带有 admin: true 属性,其他不带有这个属性,而在关系数据库中这类带来大量空余字段的属性最好拆表。
PostgreSQL 打开 HStore 扩展后也可以实现这样的结构。
如果觉得 admin: true 的例子太简单,可以考虑下怎么储存 gemspec 的内容并让它可索引。
将整个数组空间初始化成一个链表:
void IntiSpace_SL(SLinkList&space){
//将一维数组space中各分量链成一个备用链表,space[0]cur为头指针
//"0"表示空指针
for(i=0;i<MAXSIZE-1;++i)space[i]cur=i+1;
space[MAXSIZE-1]cur=0;
}//InitSpace_SL
================================================================
基于C语言的数据结构
楼主跟我的C语言程序设计课程要求设计的程序很像,有一点点不同,不过我的程序应该能满足你的要求,代码如下:
#include <stdioh>
#include <conioh>
#include <stringh>
#define N 10
struct student{
char name[20];
int cla;
int point1;
int point2;
int point3;
int sum;
int num;
};
void printf_student(struct student stu[]);
void in_student(struct student stu[]);
void look_student(struct student stu[]);
void main(){
student stu[N];
int choice1;
while(choice1!=5){
printf("请选择您要 *** 作的项目:\n");
printf("1读取数据\n2录入数据\n3分析数据\n4保存数据\n5退出\n");
scanf("%d",&choice1);
switch(choice1){
case 1:
printf_student(stu);
break;
case 2:
in_student(stu);
break;
case 3:
look_student(stu);
break;
}}
}
void printf_student(struct student stu[]){
FILE fout;
int i=0;
int j=0;
fout=fopen("stu1txt","r");
if(fout==NULL){printf("找不到文件");}
else{
while(!feof(fout)){
fscanf(fout,"%s %d %d %d %d",stu[i]name,&stu[i]cla,&stu[i]point1,&stu[i]point2,&stu[i]point3);
i++;
}
printf("已经读取");
printf("\n姓名\t\t班级\t\t成绩1\t\t成绩2\t\t成绩3\n");
for(j=0;j<i;j++){
printf("%s\t\t",stu[j]name);
printf("%d\t\t",stu[j]cla);
printf("%d\t\t",stu[j]point1);
printf("%d\t\t",stu[j]point2);
printf("%d\t\t",stu[j]point3);}
}
fclose(fout);
}
void in_student(struct student stu[]){
FILE fp;
student flag;
char ch[50]={0};
fp=fopen("stu1txt","a+");
int choice=1;
if(fp==0){printf("无法打开文件\n");}
else{
while(choice){
printf("请依次输入姓名,班级,成绩1,成绩2,成绩3\n");
scanf("%s %d %d %d %d",flagname,&flagcla,&flagpoint1,&flagpoint2,&flagpoint3);
sprintf(ch,"%s\t%d\t%d\t%d\t%d",flagname,flagcla,flagpoint1,flagpoint2,flagpoint3);
/fwrite(flagname,20,1,fp);
fwrite("\t",2,sizeof("\t"),fp);
fwrite(&flagcla,sizeof(flagcla),1,fp);
fwrite("\t",sizeof("\t"),1,fp);
fwrite(&flagpoint1,sizeof(flagpoint1),1,fp);
fwrite("\t",2,sizeof("\t"),fp);
fwrite(&flagpoint2,sizeof(flagpoint2),1,fp);
fwrite("\t",2,sizeof("\t"),fp);
fwrite(&flagpoint3,sizeof(flagpoint3),1,fp);/
fwrite(ch,strlen(ch),1,fp);
printf("%s",ch);
printf("若想继续录入,请输入1,若退出,请输入0\n");
scanf("%d",&choice);
}}
fclose(fp);
}
void look_student(struct student stu[]){
FILE fp;
int i=0;
int sum=0;
student flag;
fp=fopen("stu1txt","r");
if(fp==0){printf("无法打开文件\n");}
else{
while(!feof(fp)){
fscanf(fp,"%s %d %d %d %d",stu[i]name,&stu[i]cla,&stu[i]point1,&stu[i]point2,&stu[i]point3);
i++;
}}
for(int j=0;j<i;j++){
sum=stu[j]point1+stu[j]point2+stu[j]point3;
stu[j]sum=sum;
sum=0;
}
int t=0;
for(t=1;t<i;t++){
for(j=0;j<i-t;j++){
if(stu[j]sum<stu[j+1]sum){
strcpy(flagname,stu[j+1]name);
flagcla=stu[j+1]cla;
flagpoint1=stu[j+1]point1;
flagpoint2=stu[j+1]point2;
flagpoint3=stu[j+1]point3;
flagsum=stu[j+1]sum;
strcpy(stu[j+1]name,stu[j]name);
stu[j+1]cla=stu[j]cla;
stu[j+1]point1=stu[j]point1;
stu[j+1]point2=stu[j]point2;
stu[j+1]point3=stu[j]point3;
stu[j+1]sum=stu[j]sum;
strcpy(stu[j]name,flagname);
stu[j]cla=flagcla;
stu[j]point1=flagpoint1;
stu[j]point2=flagpoint2;
stu[j]point3=flagpoint3;
stu[j]sum=flagsum;
}
}
}
for(j=0;j<i;j++){
stu[j]num=j+1;
}
fclose(fp);
FILE creat;
char ch[30]={0};
creat=fopen("stu2txt","w");
for(j=0;j<i;j++){
sprintf(ch,"%s\t%d\t%d\t%d\t%d\t%d\t%d",stu[j]name,stu[j]cla,stu[j]point1,stu[j]point2,stu[j]point3,stu[j]sum,stu[j]num);
fwrite(ch,30,1,creat);
}
printf("姓名\t班级\t成绩1\t成绩2\t成绩3\t总分\t排名\n");
for(j=0;j<i;j++){
printf("%s\t",stu[j]name);
printf("%d\t",stu[j]cla);
printf("%d\t",stu[j]point1);
printf("%d\t",stu[j]point2);
printf("%d\t",stu[j]point3);
printf("%d\t",stu[j]sum);
printf("%d\n",stu[j]num);
}
fclose(creat);
}
注意一下,我创建的文件时stu1txt
//------------插入排序---void InsertSort(SqList &L){//对顺序表L作直接插入排序。 int i,j; for(i=2;i<=Llength;++i) if(LT(Lr[i]key,Lr[i-1]key))//“<”,需将Lr[i]插入有序子表 { Lr[0]=Lr[i];//复制为哨兵 Lr[i]=Lr[i-1]; for(j=i-2;LT(Lr[0]key,Lr[j]key);--j) Lr[j+1]=Lr[j];//记录后移 Lr[j+1]=Lr[0];//插入到正确位置 }}//--------------冒泡排序---void BubbleSort(SqList &L){//Lr是待排序的文件,采用自下向上扫描,对Lr做冒泡排序 int i,j; int exchange; // 交换标志 for(i=1;i<Llength;i++) {// 最多做 n-1 趟排序 exchange=FALSE; // 本趟排序开始前,交换标志应为假 for(j=Llength-1;j>=i;j--) // 对当前无序区 R[in] 自下向上扫描 if(LT(Lr[j+1]key,Lr[j]key)) { // 交换记录 Lr[0]=Lr[j+1]; //Lr[0]不是哨兵,仅做暂存单元 Lr[j+1]=Lr[j]; Lr[j]=Lr[0]; exchange=TRUE; // 发生了交换,故将交换标志置为真 } if(!exchange) // 本趟排序未发生交换,提前终止算法 return; } }//-----------快速排序---int Partition(SqList &L,int low,int high){//交换顺序表L中子表r[lowhigh]的记录,枢轴记录到位,并返回其所在位置,此时 //在它之前(后)的记录均不大(小)于它。 KeyType pivotkey; Lr[0]=Lr[low];//用子表的第一个记录作枢轴记录 pivotkey=Lr[low]key;//枢轴记录关键字 while(low<high) {//从表的两端交替地向中间扫描 while (low<high&&Lr[high]key>=pivotkey) --high; Lr[low]=Lr[high];//将比枢轴记录小的记录移到低端 while (low<high&&Lr[low]key<=pivotkey) ++low; Lr[high]=Lr[low];//将比枢轴记录大的记录移到高端 } Lr[low]=Lr[0];//枢轴记录到位 return low;//返回枢轴位置} void QSort(SqList &L,int low,int high){//对顺序表L中的子序列Lr[lowhigh]进行快速排序 int pivotloc; if(low<high) {//长度大于1 pivotloc=Partition(L,low,high);//将Lr[lowhigh]一分为二 QSort(L,low,pivotloc-1);//对低子表递归排序pivotloc是枢轴位置 QSort(L,pivotloc+1,high);//对高子表递归排序 }} void QuickSort(SqList &L){//对顺序表L作快速排序。 QSort(L,1,Llength);}//----------归并排序---void Merge(RedType SR[],RedType TR[],int i,int m,int n){//将有序的SR[im]和SR[m+1n]归并为有序的TR[in] int j,k; for(j=m+1,k=i;i<=m&&j<=n;++k) {//将SR中记录由小到大地并入TR if LQ(SR[i]key,SR[j]key) TR[k]=SR[i++]; else TR[k]=SR[j++]; } if(i<=m)//TR[kn]=SR[im];将剩余的SR[im]复制到TR while(k<=n&&i<=m) TR[k++]=SR[i++]; if(j<=n)//将剩余的SR[jn]复制到TR while(k<=n&&j<=n) TR[k++]=SR[j++];} void MSort(RedType SR[],RedType TR1[],int s,int t){//将SR[st]归并排序为TR1[st]。 int m; RedType TR2[20]; if(s==t) TR1[t] = SR[s]; else { m=(s+t)/2;//将SR[st]平分为SR[sm]和SR[m+1t] MSort(SR,TR2,s,m);//递归地将SR[sm]归并为有序的TR2[sm] MSort(SR,TR2,m+1,t);//将SR[m+1t]归并为有序的TR2[m+1t] Merge(TR2,TR1,s,m,t);//将TR2[sm]和TR2[m+1t]归并到TR1[st] }} void MergeSort(SqList &L){// 对顺序表L作归并排序。 MSort(Lr, Lr, 1, Llength);}//-----------堆排序---void HeapAdjust(SqList &H,int s,int m){//已知Hr[sm]中记录的关键字除Hr[s]key之外均满足堆的定义, //本函数调整Hr[s]的关键字,使Hr[sm]成为一个大顶堆 //(对其中记录的关键字而言) int j; RedType rc; rc=Hr[s]; for(j=2s;j<=m;j=2) {//沿key较大的孩子结点向下筛选 if(j<m&&Hr[j]key<Hr[j+1]key) ++j;//j为key较大的记录的下标 if(rckey>=Hr[j]key) break;//rc应插入在位置s上 Hr[s]=Hr[j]; s=j; } Hr[s]=rc;//插入} void HeapSort(SqList &H){//对顺序表H进行堆排序。 int i; RedType temp; for(i=Hlength/2;i>0;--i)//把Hr[1Hlength]建成大顶堆 HeapAdjust(H,i,Hlength); for(i=Hlength;i>1;--i) { temp=Hr[i]; Hr[i]=Hr[1]; Hr[1]=temp;//将堆顶记录和当前未经排序子序列Hr[1i]中 //最后一个记录相互交换 HeapAdjust(H,1,i-1);//将Hr[1i-1]重新调整为大顶堆 }} void main(){ SqList S; printf("---------- 五种排序算法 ----------\n"); InitList_Sq(S); printf(" 1简单插入排序\n"); InsertSort(S); Print_Sq(S); printf(" 2冒泡排序\n"); BubbleSort(S); Print_Sq(S); printf(" 3快速排序\n"); QuickSort(S); Print_Sq(S); printf(" 4归并排序\n"); MergeSort(S); Print_Sq(S); printf(" 5堆排序\n"); HeapSort(S); Print_Sq(S);}
#include<stdioh>
int main()
{
int x,count=0;
int a[100],sum=0;
int i;
while(1)
{
printf("请输入一个数字");
scanf("%d",&x);
if(x==0)
{
a[count]=0;
for(i=count;i>=0;i--)
{
sum+=a[i];
printf("%d ",sum);
}
break;
}
else
{
a[count++]=x;
}
}
return 0;
}
依次输入4,5,6,0
结果为 0,6,11,15
这个程序运行的结果和你原来那个是一样的。不信你自己运行一下。
请输入一个数字4
请输入一个数字5
请输入一个数字6
请输入一个数字0
0 6 11 15 请按任意键继续
以上就是关于数据结构的完整程序到底怎么写全部的内容,包括:数据结构的完整程序到底怎么写、急求数据结构题目:简单行编辑程序C语言、一个单简数据结构的程序代码怎样写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)