转载:一些基本算法

来源:互联网 发布:赛默飞变色龙软件 编辑:程序博客网 时间: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; }