冒泡:
#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;
}