转载:一些基本算法
来源:互联网 发布:赛默飞变色龙软件 编辑:程序博客网 时间:2024/05/01 18:58
冒泡: #include <stdio.h> #include <string.h> bubble(strings,count) char *strings; intcount; { registerintm,n; registerchars; for(m = 1;m<count;m++) for(n = count-1;n >= m;--n) { if(strings[n-1]>strings[n]) { s = strings[n-1]; strings[n-1] = strings[n]; strings[n] = s; } } } intmain(void) { intcount; charstr[200]; printf("请输入字符串:/n"); gets(str); count = strlen(str); bubble(str,count); printf("排序之后的字符串是:/n"); printf("%s./n",str); return 0; } 堆排序: #include <stdio.h> #define MARK 0 statica[8] = {MARK,25,4,36,1,60,10,58,}; intcount = 1; voidheap(intn); voidadjust(inti,intn); intmain(void) { inti; printf("源数据为:"); for(i = 1;i<8;i++) printf("%5d",a[i]); heap(7); printf("/n排序后的数据为:"); for(i = 1;i<8;i++) printf("%5d",a[i]); printf("/n"); return 0; } voidheap(n) intn; { inti,j,t; for(i =n/2;i>0;i--) adjust(i,n); printf("/n初始化成堆===> "); for(i = 1;i < 8;i++) printf("%5d",a[i]); for(i = n-1;i>0;i--) { t = a[i+1]; a[i+1] = a[1]; a[1] = t; adjust(1,i); printf("/n第%2d步操作结果===>",count++); for(j = 1;j<8;j++) printf("%5d",a[j]); } } voidadjust(i,n) inti,n; { intj,k,r,done=0; k = r = a[i]; j = 2*i; while((j<=n)&&(done==0)) { if(j<n) { if(a[j]<a[j+1]) j++; } if(k>=a[j]) done = 1; else { a[j/2] = a[j]; j = 2* j; } } a[j/2] = r; }文件排序: #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUM 4 struct data { char name[20]; char school[20]; char city[20]; char province[20]; }info; struct data addrs[NUM]= { "WenHai","BIT","JiLin","JiLin", "TongWei","BIT","ZhengJiang","JiangSu", "SunYou","BIT","WeiFang","ShangDong", "XiaoMing","PKU","TaiYuan","ShanXi" }; /*对后面要用到的函数进行声明*/ void quick_disk(FILE *fp,int count); void qs_disk(FILE *fp,intleft,intright); void exchangedata(FILE *fp,long i, long j); char *get_name(FILE *fp, long rec); void print_data(struct data *p); struct data *get_data(FILE *fp,long rec); int main(void) { inti; FILE *fp; /*文件指针*/ /*以读写方式生成文本文件fp*/ if((fp = fopen("datalist.txt","w+")) == NULL) { printf("打开文件失败/n"); exit(1); } printf("将未排序的数据写入文件/n"); /*将数组Sdata[NUM]写入文件中*/ fwrite(addrs,sizeof(addrs),1,fp); /*将文件中的数组Sdata[NUM]依次取出并打印*/ for(i=0;i<NUM;i++) { struct data *p; p = get_data(fp,i); /*得到Sdata[i]的指针*/ print_data(p); /*将结构体Sdata[i]各个成员变量打印出*/ printf("/n"); } fclose(fp); /*关闭文件指针*/ /*以二进制方式再次打开文件datalist.txt*/ if((fp=fopen("datalist.txt","rb+"))==NULL) { printf("不能以读写方式打开文件/n"); exit(1); } printf("将文件数据排序/n"); /*调用字符串排序函数将文本中的字符串结构体排序*/ quick_disk(fp,NUM); printf("排序结束/n"); /*将排序结束后的数组数据打印出来*/ for(i=0;i<4;i++) { struct data *p; p = get_data(fp,i); print_data(p); printf("/n"); } fclose(fp); return 0; } /*应用快速排序方法对字符串进行排序*/ void quick_disk(FILE *fp,int count) { qs_disk(fp,0,count-1); } /*排序函数*/ void qs_disk(FILE *fp,intleft,intright) { long inti,j; char x[30]; i = left; j = right; /*比较字符串x为Sdata数组中间一个结构变量的name成员变量*/ strcpy(x,get_name(fp,(long)(i+j)/2)); do { /*比较当前结构变量的name成员变量于比较字符串x的大小*/ while((strcmp(get_name(fp,i),x)<0)&&(i<right)) i++; while((strcmp(get_name(fp,j),x)>0)&&(j>left)) j--; if(i<=j) { exchangedata(fp,i,j); /*交换i和j对应的数据*/ i++; j--; } }while(i<j); if(left<j) /*反复调用此排序函数,直到j达到数据的最左端*/ qs_disk(fp,left,(int)j); if(i<right) /*反复调用此排序函数,直到i达到数据的最右端*/ qs_disk(fp,(int)i,right); } /*交换i和j在文件中对应的数据*/ void exchangedata(FILE *fp,long i,long j) { char a[sizeof(info)],b[sizeof(info)]; fseek(fp,sizeof(info)*i,SEEK_SET); /*找到i在文件中对应的数据位置*/ fread(a,sizeof(info),1,fp); /*将该位置数据读到字符串数组a中*/ fseek(fp,sizeof(info)*j,SEEK_SET); /*找到j在文件中对应的数据位置*/ fread(b,sizeof(info),1,fp); /*将该位置数据读到字符串数组b中*/ fseek(fp,sizeof(info)*j,SEEK_SET); /*找到j在文件中对应的数据位置*/ fwrite(a,sizeof(info),1,fp); /*将刚才读入a中的数据写入到该位置*/ fseek(fp,sizeof(info)*i,SEEK_SET); /*找到i在文件中对应的数据位置*/ fwrite(b,sizeof(info),1,fp); /*将刚才读入b中的数据写入到该位置*/ /*完成文件中i和j处对应数据的交换*/ } /*得到文件fp中变量rec对应的结构体变量的name成员变量*/ char *get_name(FILE *fp,long rec) { struct data *p; p = &info; rewind(fp); /*找到该结构体变量得的位置*/ fseek(fp,rec*sizeof(struct data),SEEK_SET); /*将其读到指针p*/ fread(p,sizeof(struct data),1L,fp); return p->name; /*返回该结构体变量的name成员变量*/ } /*得到文件fp中变量rec对应的结构体变量的指针*/ struct data *get_data(FILE *fp,long rec) { struct data *p; p = &info; rewind(fp); /*找到该结构体变量得的位置*/ fseek(fp,rec*sizeof(info),SEEK_SET); /*将其读到指针p*/ fread(p,sizeof(info),1,fp); return p; /*返回该结构体指针*/ } /*将指针p对应的结构体的各个成员变量打印出来*/ void print_data(struct data *p) { printf("姓名:%s/n",p->name); printf("学校:%s/n",p->school); printf("城市:%s/n",p->city); printf("省 :%s/n",p->province); } 链表搜索: #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUM 4 struct chain { char name[20]; char city[20]; char sex[10]; char age[10]; char job[10]; struct chain *next; }; struct chain *create(); struct chain *SequelSeach(head,name); void print_data(point); struct chain Datas[NUM]= { "Sun","Weifang","Male","24","student",NULL, "Tom","Beijing","Male","31","doctor",NULL, "Marry","Shanghai","Female","19","techer",NULL, "Willing","Tianjing","Female","21","worker",NULL }; int main(void) { struct chain *head; struct chain *p; char name[30]; head = create(); printf("请输入要查找的人名/n"); scanf("%s",name); p = SequelSeach(head,name); print_data(p); return 0; } struct chain *create() { struct chain *head, *tail, *p; inti; head = tail = NULL; printf("将名单数据输入到链表中:/n"); for(i= 0;i < NUM; i++) { p = (struct chain *)malloc (sizeof (struct chain)); strcpy(p->name, Datas[i].name); strcpy(p->city,Datas[i].city); strcpy(p->sex,Datas[i].sex); strcpy(p->age,Datas[i].age); strcpy(p->job,Datas[i].job); p->next = NULL; if(head == NULL) head = tail = p; else tail = tail ->next; tail ->next = p; } return head; } struct chain *SequelSeach(head,name) struct chain *head; char name[]; { struct chain *temp; temp = head; for(temp=head;temp!=NULL;) { if(strcmp(temp->name,name) == 0) break; else temp = temp->next; } if(temp ==NULL) printf("没有查找到该人资料/n"); return temp; } void print_data(point) struct chain *point; { if(point ==NULL) return; printf("查找结果:/n"); printf(" 姓名:%s/n",point->name); printf(" 城市:%s/n",point->city); printf(" 性别:%s/n",point->sex); printf(" 年龄:%s/n",point->age); printf(" 工作:%s/n",point->job); } 二分法查找: #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUM 4 structData { charname[20]; charcity[20]; charsex[10]; charage[10]; charjob[10]; }; structDataSDatas[NUM]= { "Sun","Weifang","Male","24","student", "Tom","Beijing","Male","31","doctor", "Marry","Shanghai","Female","19","techer", "Willing","Tianjing","Female","21","worker" }; voidqs_struct(items,left,right); voidquick_struct(items,count); intBinarySeach(items,name,n); voidprint_data(point); intmain(void) { charname[30]; inti; printf("将原始数据排序/n"); quick_struct(SDatas,NUM); printf("请输入要查找人的名字:/n"); scanf("%s",name); i = BinarySeach(SDatas,name,NUM); if(i == -1) { printf("没有查找到该人信息/n"); return 0; } printf("查找结果:/n"); print_data(&SDatas[i]); return 1; } voidquick_struct(items,count) structData items[]; intcount; { qs_struct(items,0,count-1); } voidqs_struct(items,left,right) structData items[]; intleft; intright; { registerinti,j; char *x; structDatatemp; i = left; j = right; x = items[(left+right/2)].name; do { while((strcmp(items[i].name,x)<0)&&(i<right)) i++; while((strcmp(items[j].name,x)>0)&&(j>left)) j--; if(i<=j) { temp = items[i]; items[i] = items[j]; items[j] = temp; i++; j--; } }while(i<=j); if(left<j) qs_struct(items,left,j); if(i<right) qs_struct(items,i,right); } intBinarySeach(items,name,n) structData items[]; charname[]; intn; { intlow,high,mid; low = 0; high = n-1; while(low<=high) { mid = (low+high)/2; if((strcmp(items[mid].name,name)==0)) returnmid; elseif((strcmp(items[mid].name,name)<0)) low = mid+1; elsehigh = mid-1; } return -1; } voidprint_data(point) structData *point; { if(point ==NULL) return; printf(" 姓名:%s/n",point->name); printf(" 城市:%s/n",point->city); printf(" 性别:%s/n",point->sex); printf(" 年龄:%s/n",point->age); printf(" 工作:%s/n",point->job); } 树查找: #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUM 4 structtree { charname[20]; charcity[20]; charsex[10]; charage[10]; charjob[10]; structtree *left; structtree *right; }; structtreeDatas[NUM]= { "Willing","Tianjing","Female","21","worker",NULL,NULL, "Tom","Beijing","Male","31","doctor",NULL,NULL, "Sun","Weifang","Male","24","student",NULL,NULL, "Marry","Shanghai","Female","19","techer",NULL,NULL }; structtree *construct( structtree *root, structtree *r, structtree *Data) { if(!r) { r = (structtree *)malloc(sizeof(structtree)); if(!r) { printf("内存分配失败!"); exit(0); } r->left = NULL; r->right = NULL; strcpy(r->name,Data->name); strcpy(r->city,Data->city); strcpy(r->sex,Data->sex); strcpy(r->age,Data->age); strcpy(r->job,Data->job); if(!root) returnr; if(strcmp(Data->name,root->name)<0) root->left = r; else root->right = r; returnr; } if(strcmp(Data->name,r->name)<0) construct(r,r->left,Data); else construct(r,r->right,Data); returnroot; } structtree *Search(root,name) structtree *root; charname[]; { structtree *p; if(root == NULL) printf("该树为空/n"); p = root; while(strcmp(p->name,name)!=0) { if(strcmp(p->name,name)>0) p = p->left; else p = p->right; if(p == NULL) break; } return(p); } voidprint(structtree *r) { if(!r) return; print(r->left); printf("%s/n",r->name); print(r->right); } voidprint_currentData(structtree *point) { if(point == NULL) return; printf(" 姓名:%s/n",point->name); printf(" 城市:%s/n",point->city); printf(" 性别:%s/n",point->sex); printf(" 年龄:%s/n",point->age); printf(" 工作:%s/n",point->job); } intmain(void) { inti; charc[10]; charswap[20]; charname[20]; structtree *root,*p; structtree *temp; p = NULL; temp = NULL; root = NULL; for(i = 0;i<NUM;i++) root =construct(root,root,&Datas[i]); printf("现有人员资料:/n"); print(root); printf("请输入要查找的人的名字/n"); scanf("%s",name); p = Search(root,name); if(p == NULL) { printf("没有该人资料/n"); printf("是否要插入该人资料[y/n]/n"); scanf("%s",c); if(strcmp(c,"y")==0) { temp = (structtree *)malloc(sizeof(structtree)); if(!temp) { printf("内存分配失败!"); exit(0); } printf("请输入该人姓名:/n"); scanf("%s",swap); strcpy(temp->name,swap); printf("请输入该人所在城市:/n"); scanf("%s",swap); strcpy(temp->city,swap); printf("请输入该人性别[Male/Female]:/n"); scanf("%s",swap); strcpy(temp->sex,swap); printf("请输入该人年龄:/n"); scanf("%s",swap); strcpy(temp->age,swap); printf("请输入该人工作:/n"); scanf("%s",swap); strcpy(temp->job,swap); temp->left = NULL; temp->right = NULL; root =construct(root,root,temp); print_currentData(temp); printf("现有人员资料:/n"); root = root; print(root); } else return 0; } print_currentData(p); return 1; }
- 转载:一些基本算法
- 转载:一些基本算法
- 一些基本算法(全文转载)
- 一些基本排序算法的实现(转载)
- 一些 基本算法
- 一些基本算法
- 基本的一些算法
- 一些基本算法
- 一些算法问题(转载)
- 图的一些基本算法
- 队列的一些基本算法
- 二叉树一些基本算法
- 图像匹配 一些基本算法
- 一些基本的形态学算法
- 一些基本形态学算法------边缘提取算法
- 一些基本形态学算法------区域填充算法
- 转载各种基本算法的实现
- [转载] 陈皓:一些重要的算法
- 数据库的备份和恢复
- SDK封装的一个无边框窗口
- Daily word
- 关于C#中的DateTime类型的细节问题
- 一路考试过来,一路深刻反思——IT人,到底该考多少证?
- 转载:一些基本算法
- 什么是百度留言板
- 转载:一些基本算法
- 终于弄明白了傅里叶变换--FashionXu的博客
- 使用linq to xml 快速创建自己的Rss
- sqlplus使用技巧
- 如何使用CppUnit进行单元测试
- alv macro
- 使用linq to xml 快速创建自己的Rss 之二 Syndication篇