算法

冒泡:
#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;
         /*比较字符串xSdata数组中间一个结构变量的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);              /*交换ij对应的数据*/
                            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);
}
/*交换ij在文件中对应的数据*/
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中的数据写入到该位置*/
         /*完成文件中ij处对应数据的交换*/
}
/*得到文件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;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值