算法

冒泡:
#include < stdio .h>
#include < string .h>
 
bubble( strings , count )
char * strings ;
int count ;
{
         register int m , n ;
         register char s ;
         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 ;
                            }
                   }
}
 
int main ( void )
{
         int count ;
         char str [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
 
static a [8] = { MARK ,25,4,36,1,60,10,58,};
int count = 1;
void heap ( int n );
void adjust ( int i , int n );
 
int main ( void )
{
         int i ;
         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;
}
 
void heap ( n )
int n ;
{
         int i , 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 ]);
         }
}
 
void adjust ( i , n )
int i , n ;
{
         int j , 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, int left , int right );
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)
{
         int i ;
         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, int left , int right )
{
         long int i ,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 ;
         int i ;
         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
 
struct Data
{
         char name [20];
         char city [20];
         char sex [10];
         char age [10];
         char job [10];
};
 
struct Data SDatas [ NUM ]=
{
         "Sun" , "Weifang" , "Male" , "24" , "student" ,
         "Tom" , "Beijing" , "Male" , "31" , "doctor" ,
         "Marry" , "Shanghai" , "Female" , "19" , "techer" ,
         "Willing" , "Tianjing" , "Female" , "21" , "worker"
};
 
void qs_struct (items, left , right );
void quick_struct (items, count );
int BinarySeach (items, name , n );
void print_data (point);
 
int main ( void )
{
         char name [30];
         int i ;
         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;
}
 
 
void quick_struct (items, count )
struct Data items[];
int count ;
{
         qs_struct (items,0, count -1);
}
 
void qs_struct (items, left , right )
struct Data items[];
int left ;
int right ;
{
         register int i , j ;
         char * x ;
         struct Data temp ;
         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 );
}
 
int BinarySeach (items, name , n )
struct Data items[];
char name [];
int n ;
{
         int low , high , mid ;
         low = 0;
         high = n -1;
         while ( low <= high )
         {
                   mid = ( low + high )/2;
                  if (( strcmp (items[ mid ]. name , name )==0))
                            return mid ;
                   else if (( strcmp (items[ mid ]. name , name )<0))
                            low = mid +1;
                   else high = mid -1;
         }
         return -1;
}
 
void print_data (point)
struct Data *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
 
struct tree
{
         char name [20];
         char city [20];
         char sex [10];
         char age [10];
         char job [10];
         struct tree * left ;
         struct tree * right ;
};
 
struct tree Datas [ 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
};
 
struct tree * construct (
         struct tree * root ,
         struct tree * r ,
         struct tree * Data )
{
         if (! r )
         {
                   r = ( struct tree *) malloc ( sizeof ( struct tree ));
                   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 )
                            return r ;
                  if ( strcmp ( Data -> name , root -> name )<0)
                            root -> left = r ;
                   else
                            root -> right = r ;
                   return r ;
         }
         if ( strcmp ( Data -> name , r -> name )<0)
                  construct ( r , r -> left , Data );
         else
                  construct ( r , r -> right , Data );
 
         return root ;        
}
 
struct tree * Search ( root , name )
struct tree * root ;
char name [];
{
         struct tree * 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 );
}
 
void print ( struct tree * r )
{
         if (! r )
                   return ;
         print ( r -> left );
         printf ( "%s/n" , r -> name );
         print ( r -> right );
}
 
void print_currentData ( struct tree * 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 );
}
 
int main ( void )
{
         int i ;
         char c [10];
         char swap [20];
         char name [20];
         struct tree * root ,* p ;
         struct tree * 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 = ( struct tree *) malloc ( sizeof ( struct tree ));
                            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、付费专栏及课程。

余额充值