#ifndef H_STUDENT_HH

創(chuàng)新互聯(lián)自2013年創(chuàng)立以來,先為十堰鄖陽等服務建站,十堰鄖陽等地企業(yè),進行企業(yè)商務咨詢服務。為十堰鄖陽企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。
#define H_STUDENT_HH
#include "stdio.h"
#include "string.h"棗知友
#include "malloc.h"
#define LEN sizeof(struct message_student) /*一個結(jié)構(gòu)體數(shù)組元素的長度*/
#define numsubs 5 /*學科數(shù)目*/
typedef struct message_student /*結(jié)構(gòu)體定義猛蔽*/
{
char number[6];
char name[20];
char sex[4];
float subject[numsubs];
float score;
float average;
int index;
}student;
extern int numstus; /*學生數(shù)目*/
extern student *pointer; /*指向結(jié)構(gòu)體數(shù)組*/
extern int lens;
int menu_select(); /*函數(shù)聲明*/
int openfile(student stu[]);
int findrecord(student stud[]);
int writetotext(student stud[]);
void welcome();
void display1();
void showtable();
void sort(student stu[]);
void deleterecord(student stu[],int i);
void addrecord(student stud[]);
void display(student stud[],int n1,int n2);
void amendrecord(student stud[]);
void count(student stud[]);
void sortnum(student stud[]);
void sortnum2(student stud[]);
void sortname(student stud[]);
void sortname2(student stud[]);
void sortcount(student stud[]);
void sortcount2(student stud[]);
void statistic(student stud[]);
void display1();
#endif
//#include "head.h"
int menu_select()
{
char c;
printf("\n\n");
printf(" | 1. 增加學生記錄 5.統(tǒng)計信息 |\n");
printf(" | 2. 查詢學生記錄 6.打開文件 |\n");
printf(" | 3. 修改學生記錄 7.保存文件 |\n");
printf(" | 4. 學生紀錄排序 8.顯示記錄 |\n");
printf(" | 0.退出系統(tǒng) |\n");
printf("\n\n");
printf("請選擇(0-8):");
c=getchar();
getchar();
return (c-'0');
}
//#include "head.h"
int findrecord(student stud[]) /*查找信息*/
{
char str[2];
int i,num;
if(numstus==0)
{
printf("沒有可被查找的凳槐記錄\n");
return -1;
}
else
{
printf("以何種方式查找?\n1.學號\t2.姓名\t3.名次\n");
gets(str);
if(str[0]=='1') /*按學號查找*/
{
printf("請輸入學號:");
gets(str);
for(i=0;i=numstus;i++)
if(strcmp(str,stud[i].number)==0)
{
display(stud,i,i);
break;
}
else continue;
}
else if(str[0]=='2') /*按姓名查找*/
{
printf("請輸入姓名:");
gets(str);
for(i=0;i=numstus;i++)
if(strcmp(str,stud[i].name)==0)
{
display(stud,i,i);
break;
}
else continue;
}
else if(str[0]=='3') /*按名次查找*/
{
printf("請輸入名次:");
scanf("%d",num);
getchar();
for(i=0;i=numstus;i++)
if(num==stud[i].index)
{
display(stud,i,i);
break;
}
else continue;
}
if(inumstus)
{
printf("沒有查找所要的信息。\n");
return -1;
}
return i;
}
}
//#include"head.h"
int openfile(student stu[])
{
int i=0,j;
FILE *fp;
char filename[20],str[2];
if(numstus!=0)
{
printf("已經(jīng)有記錄存在,是否保存?(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
writetotext(stu);
}
printf("請輸入文件名:");
gets(filename);
numstus=0;
if((fp=fopen(filename,"rb+"))==NULL)
{
printf("無法打開該文件\n");
return(-1);
}
fscanf(fp,"%d",numstus);
fgetc(fp);
while(inumstus)
{
fscanf(fp,"%s",stu[i].number);
fscanf(fp,"%s",stu[i].name);
fscanf(fp,"%s",stu[i].sex);
for(j=0;jnumsubs;j++)
fscanf(fp,"%f",stu[i].subject[j]);
fscanf(fp,"%f",stu[i].score);
fscanf(fp,"%f",stu[i].average);
fscanf(fp,"%d",stu[i].index);
i++;
}
fclose(fp);
printf("文件讀取成功\n");
printf("是否顯示紀錄?(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
display(stu,0,numstus-1);
return(0);
}
//#include "head.h"
void sort(student stud[])
{
int i,j=0;
char str[5];
student *p;
p=stud;
if(numstus==0)
{
printf("沒有可供查詢的記錄!");
}
while(1)
{
for(i=0i++)
{
printf(" 請輸入查詢方式:");
printf("(直接輸入回車則結(jié)束查詢操作)\n");
printf("1.按照學號\t");
printf("2.按照姓名\t");
printf("3.按照名次\n");
gets(str);
if(strlen(str)==0) break;
if(str[0]=='1')
{
printf("請輸入排序次序:\n");
printf("1.升序排列\(zhòng)t");
printf("2.降序排列\(zhòng)n");
gets(str);
if(str[0]=='1')
sortnum2(p);
else
sortnum(p);
display(stud,0,numstus-1);
}
else if(str[0]=='2')
{
printf("請輸入排序次序:\n");
printf("1.升序排列\(zhòng)t");
printf("2.降序排列\(zhòng)n");
gets(str);
if(str[0]=='1')
sortname2(p);
else
sortname(p);
display(stud,0,numstus-1);
}
else if(str[0]=='3')
{
printf("請輸入排序次序:\n");
printf("1.升序排列\(zhòng)t");
printf("2.降序排列\(zhòng)n");
gets(str);
if(str[0]=='1')
sortcount2(p);
else
sortcount(p);
display(stud,0,numstus-1);
}
else printf("請輸入1~3");
printf("是否退出排序?(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y') break;
}
return;
}
}
void sortnum(student stud[])
{
int i,j;
student temp;
student *p;
p=stud;
for(i=0;inumstus;i++)
for(j=0;jnumstus-i-1;j++)
{
if(strcmp(stud[j+1].number,stud[j].number)0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
void sortnum2(student stud[])
{
int i,j;
student temp;
student *p;
p=stud;
for(i=0;inumstus;i++)
for(j=0;jnumstus-i-1;j++)
{
if(strcmp(stud[j].number,stud[j+1].number)0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
void sortname(student stud[])
{
int i,j;
student temp;
student *p;
p=stud;
for(i=0;inumstus;i++)
for(j=0;jnumstus-i-1;j++)
{
if(strcmp(stud[j+1].name,stud[j].name)0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
void sortname2(student stud[])
{
int i,j;
student temp;
student *p;
p=stud;
for(i=0;inumstus;i++)
for(j=0;jnumstus-i-1;j++)
{
if(strcmp(stud[j].name,stud[j+1].name)0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
void sortcount(student stud[])
{
int i,j;
student temp;
student *p;
p=stud;
for(i=0;inumstus;i++)
for(j=0;jnumstus-i-1;j++)
{
if(stud[j+1].indexstud[j].index)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
void sortcount2(student stud[])
{
int i,j;
student temp;
student *p;
p=stud;
for(i=0;inumstus;i++)
for(j=0;jnumstus-i-1;j++)
{
if(stud[j].indexstud[j+1].index)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
//#include"head.h"
void statistic(student stud[]) /*新增功能,輸出統(tǒng)計信息*/
{
int i,j=0,k=0;
char c1,str[2];
float average[numsubs],sum=0;
if(numstus==0)
printf("沒有可被查找的記錄\n");
else
{
while(1)
{
printf("下面將統(tǒng)計考試成績\n");
printf("請選擇你要統(tǒng)計哪科的成績 1.A\t2.B\t3.C\t4.D\t5.E\n");
c1=getchar();
printf("\t一共有個%d記錄\n",numstus); /*總共記錄數(shù)*/
switch(c1)
{
case '1':
for(i=0;inumstus;i++) /*循環(huán)輸入判斷*/
{
sum+=stud[i].subject[0];
if(stud[k].subject[0]stud[i].subject[0]) k=i;
if(stud[j].subject[0]stud[i].subject[0]) j=i;
}
average[0]=sum/numstus;
printf("\t科目A的最高分:\n"); /*最高分*/
printf("\t\t學號:%s 姓名:%s 分數(shù):%.2f\n",stud[j].number,stud[j].name,stud[j].subject[0]);
printf("\t科目A的最低分是:\n"); /*最低分*/
printf("\t\t學號:%s 姓名:%s 分數(shù):%.2f\n",stud[k].number,stud[k].name,stud[k].subject[0]);
printf("\t科目A的平均分是 %5.2f\n",average[0]); /*平均分*/
break;
case '2':
for(i=0;inumstus;i++) /*循環(huán)輸入判斷*/
{
sum+=stud[i].subject[1];
if(stud[k].subject[1]stud[i].subject[1]) k=i;
if(stud[j].subject[1]stud[i].subject[1]) j=i;
}
average[1]=sum/numstus;
printf("\t科目B的最高分:\n"); /*最高分*/
printf("\t\t學號:%s 姓名:%s 分數(shù):%.2f\n",stud[j].number,stud[j].name,stud[j].subject[1]);
printf("\t科目B的最低分是:\n"); /*最低分*/
printf("\t\t學號:%s 姓名:%s 分數(shù):%.2f\n",stud[k].number,stud[k].name,stud[k].subject[1]);
printf("\t科目B的平均分是 %5.2f\n",average[1]); /*平均分*/
break;
case '3':
for(i=0;inumstus;i++) /*循環(huán)輸入判斷*/
{
sum+=stud[i].subject[2];
if(stud[k].subject[2]stud[i].subject[2]) k=i;
if(stud[j].subject[2]stud[i].subject[2]) j=i;
}
average[2]=sum/numstus;
printf("\t科目C的最高分:\n"); /*最高分*/
printf("\t\t學號:%s 姓名:%s 分數(shù):%.2f\n",stud[j].number,stud[j].name,stud[j].subject[2]);
printf("\t科目C的最低分是:\n"); /*最低分*/
printf("\t\t學號:%s 姓名:%s 分數(shù):%.2f\n",stud[k].number,stud[k].name,stud[k].subject[2]);
printf("\t科目C的平均分是 %5.2f\n",average[2]); /*平均分*/
break;
case '4':
for(i=0;inumstus;i++) /*循環(huán)輸入判斷*/
{
sum+=stud[i].subject[3];
if(stud[k].subject[3]stud[i].subject[3]) k=i;
if(stud[j].subject[3]stud[i].subject[3]) j=i;
}
average[3]=sum/numstus;
printf("\t科目D的最高分:\n"); /*最高分*/
printf("\t\t學號:%s 姓名:%s 分數(shù):%.2f\n",stud[j].number,stud[j].name,stud[j].subject[3]);
printf("\t科目D的最低分是:\n"); /*最低分*/
printf("\t\t學號:%s 姓名:%s 分數(shù):%.2f\n",stud[k].number,stud[k].name,stud[k].subject[3]);
printf("\t科目D的平均分是 %5.2f\n",average[3]); /*平均分*/
break;
case '5':
for(i=0;inumstus;i++) /*循環(huán)輸入判斷*/
{
sum+=stud[i].subject[4];
if(stud[k].subject[4]stud[i].subject[4]) k=i;
if(stud[j].subject[4]stud[i].subject[4]) j=i;
}
average[4]=sum/numstus;
printf("\t科目E的最高分:\n"); /*最高分*/
printf("\t\t學號:%s 姓名:%s 分數(shù):%.2f\n",stud[j].number,stud[j].name,stud[j].subject[4]);
printf("\t科目E的最低分是:\n"); /*最低分*/
printf("\t\t學號:%s 姓名:%s 分數(shù):%.2f\n",stud[k].number,stud[k].name,stud[k].subject[4]);
printf("\t科目E的平均分是 %5.2f\n",average[4]); /*平均分*/
break;
default:printf("輸入錯誤!請輸入1~5之間的數(shù)\n");
}
sum=0;
getchar();
printf("是否繼續(xù)進行統(tǒng)計?(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y') ;
else break;
}
}
}
int writetotext(student stud[]) /*將所有記錄寫入文件*/
{
int i=0,j;
FILE *fp;
char filename[20];
printf("輸入文件名稱:");
gets(filename);
fp=fopen(filename,"w");
fprintf(fp,"%d\n",numstus);
while(inumstus)
{
fprintf(fp,"%s %s %s ",stud[i].number,stud[i].name,stud[i].sex);
for(j=0;jnumsubs;j++)
fprintf(fp,"%f ",stud[i].subject[j]);
fprintf(fp,"%f %f %d ",stud[i].score,stud[i].average,stud[i].index);
i++;
}
fclose(fp);
printf("已成功存儲!\n");
display(stud,0,numstus-1);
numstus=0;
return 0;
}
void welcome()
{
printf("\t*************************************************************\n");
printf("\t\t\t\t這是一個學生成績管理系統(tǒng)\n\t\t\t\t 傾情奉獻 歡迎使用!\n");
printf("\t*************************************************************\n");
}
void showtable()
{
printf("---------------------------------------------------------------------------------------\n");
printf("學號\t姓名\t性別\tA\tB\tC\tD\tE\t總分\t平均分\t名次\n");
printf("---------------------------------------------------------------------------------------\n");
}
void display(student stud[],int n1,int n2)
{
int i;
showtable(); /*顯示表頭*/
for(i=n1;i=n2;i++)
printf("%s\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%d\t\n",stud[i].number,stud[i].name,stud[i].sex,stud[i].subject[0],stud[i].subject[1],stud[i].subject[2],stud[i].subject[3],stud[i].subject[4],stud[i].score,stud[i].average,stud[i].index);
/*通過循環(huán)輸出數(shù)據(jù)*/
}
void display1()
{
printf("\t\t本系統(tǒng)由計應精英一組親情制作\n\n");
printf("\t\t制作人員列表: (按比劃)\n");
printf("\t\t王慶斌\t\t\t張威\n\t\t李智\t\t\t周在峰\n\t\t楊凱\t\t\t胡楊\n");
printf("\n\n");
getchar();
}
#includestring.h
void amendrecord(student stud[])
{
char str[5]; /*供用戶輸入*/
int i=-1,j;
if(numstus==0) /*沒有記錄返回*/
printf("沒有可供修改的記錄!");
while(i0)
{
i=findrecord(stud);
if(i=0)
{
printf("要刪除這個學生的信息嗎?(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
{
deleterecord(stud,i);
count(stud);
}
else
{
printf("確定要修改這個學生的信息嗎?(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
{
printf("下面請重新輸入學生的信息:\n");
printf("請輸入學號:");
gets(stud[i].number);
printf("請輸入姓名:");
gets(stud[i].name);
printf("請輸入性別(男/女 1/0):");
gets(str);
if(str[0]=='0')
strcpy(stud[i].sex,"女");
else
strcpy(stud[i].sex,"男");
stud[i].score=0;
printf("請按順序輸入成績:");
for(j=0;jnumsubs;j++)
{
scanf("%f",stud[i].subject[j]);
stud[i].score+=stud[i].subject[j];
}
getchar();
stud[i].average=stud[i].score/numsubs;
}
count(stud);
}
display(stud,0,numstus-1);
}
printf("是否繼續(xù)進行其他修改?(y/n)\n");
gets(str);
if(str[0]=='y'||str[0]=='Y')
i=-1;
else i=1;
}
}
void deleterecord(student stu[],int i) /*刪除信息*/
{
int j;
while(i=0)
{
for(j=i;jnumstus;j++)
stu[j]=stu[j+1];
numstus--;
printf("刪除成功!\n");
}
}
void count(student stud[])
{
int i,j;
for(i=0;inumstus;i++)
{
stud[i].index=1;
for(j=0;jnumstus;j++)
if(stud[j].scorestud[i].score)
stud[i].index++;
}
}
void addrecord(student stud[])
{
int i=0,j,num;
char str[5];
if(numstus!=0)
{
printf("已有記錄存在是否覆蓋?(y/n)\n");
gets(str);
if(str[0]=='Y'||str[0]=='y')
i=0;
else i=numstus;
}
printf("請輸入增加的學生信息條目數(shù):");
scanf("%d",num);
if(i==0)
numstus=num;
else numstus+=num;
if(numstuslens)
{
lens+=50;
pointer=(student *)realloc(pointer,lens*LEN);
}
printf("請輸入學生信息:\n");
for(;inumstus;i++)
{
getchar();
printf("請輸入學號:");
gets(pointer[i].number);
printf("請輸入姓名:");
gets(pointer[i].name);
printf("請輸入性別(男/女 1/0):");
gets(pointer[i].sex);
if(pointer[i].sex[0]=='0') strcpy(pointer[i].sex,"女");
else strcpy(pointer[i].sex,"男");
printf("請輸入各科成績:(按ABCDE的順序):");
stud[i].score=0;
for(j=0;jnumsubs;j++)
{
scanf("%f",stud[i].subject[j]); /*計算總分*/
stud[i].score+=stud[i].subject[j];
}
stud[i].average=stud[i].score/numsubs; /*計算平均分*/
}
count(stud); /*附名次*/
display(stud,0,numstus-1);
getchar();
}
int numstus;
int lens;
student *pointer;
void main()
{
int i=1;
char str[2];
lens=100;
pointer=(student *)malloc(lens*LEN); /*分配內(nèi)存*/
numstus=0;
welcome(); /*歡迎界面*/
while(i0)
{
i=menu_select(); /*控制菜單*/
switch(i)
{
case 1:addrecord(pointer);break; /*增加學生信息*/
case 2:findrecord(pointer);break; /*查詢學生信息*/
case 3:amendrecord(pointer);break; /*修改學生信息*/
case 4:sort(pointer);break; /*學生信息排序*/
case 5:statistic(pointer);break; /*統(tǒng)計信息*/
case 6:openfile(pointer);break; /*打開文件*/
case 7:writetotext(pointer);break; /*保存文件*/
case 8:display(pointer,0,numstus-1);break; /*顯示記錄*/
case 0:
if(numstus!=0) printf("是否保存當前記錄?(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
writetotext(pointer);
i=-1;break; /*退出系統(tǒng)*/
default:printf("請輸入數(shù)字0~8:\n");i=1; /*輸入錯誤*/
}
}
printf("\t\t歡迎再次使用本系統(tǒng)。\n\n");
display1();
}
int get_code_len(int index)
{
check();
if (index 0 || index = (int)code_lens.size())
throw new huffman_exception("參數(shù)非法殲耐");
return code_lens[index];
}
vectorint get_all_code_lens(void)
{
check();
return code_lens;
}
unsigned long get_code(int index)
{
check();
if (index 0 || index = (int)codes.size())
throw new huffman_exception("參數(shù)非法");
return codes[index];
}
vectorunsigned long get_all_codes(void)
{
check();
return codes;
}
string get_code_str(int index)
{
check();
if (index 0 || index = (int)codes.size())
throw new huffman_exception("參數(shù)非法");
return long_to_string(codes[index], code_lens[index]);
}
vectorstring get_all_code_strs(void)
{
check();
vectorstring v;
for(int i = 0; i (int)codes.size(); i++)
v.push_back(long_to_string(codes[i], code_lens[i]));
return v;
}
int find(unsigned long code)
{
check();
for(int i = 0; i (int)codes.size(); i++)
if (codes[i] == code)
return i;
return -1;
}
int find(const string code)
{
return find(string_to_long(code.c_str()));
}
inline void check()
{
if (codes.size() 罩改殲= 0)
throw new huffman_exception("尚未調(diào)用過generate_codes()");
}
unsigned long string_to_long(const char* code)
{
unsigned long ret = 0;
int len = (int)strlen(code);
for(int i = len - 1; i = 0; i--)
if (code[i] == '1')
ret |= (1ul (len - i - 1));
return ret;
}
string long_to_string(unsigned long code, int code_len)
{
char* buf = new char[code_len + 1];
if (buf == NULL)
throw new huffman_exception("no enough memory.");
memset(buf, 0, code_len + 1);
unsigned long bit = 1 (code_len - 1);
for(int i = 0; i code_len; i++)
{
if (code bit)
buf[i] = '1';
else
buf[i] = '0';
bit = 1;
}
string ret(buf); delete buf;
return ret;
}
void generate_canonical_codes()
{
if (code_lens.size() = 0)
throw new huffman_exception("生成Canonical Huffman編碼前,應已知所有元物沖素碼長");
int max_code_len = 0;
int min_code_len = 1000;
const int tmp = sizeof(unsigned long) * 8 + 1;
int len_count[tmp];
unsigned long min_code[tmp];
memset(len_count, 0, tmp * sizeof(int));
memset(min_code, 0, tmp * sizeof(unsigned long));
int num = (int)code_lens.size();
// 統(tǒng)計碼長信息
for (int i = 0; i num; i++)
{
int codelen = code_lens[i];
// huffman_base用unsigned long存儲編碼,因此
// 碼長要限制在sizeof(unsigned long)*8以內(nèi)
// 這里對超長的編碼都簡單忽略掉了
if ((unsigned long)codelen sizeof(unsigned long)*8)
continue;
if (codelen max_code_len)
max_code_len = codelen;
if (codelen min_code_len)
min_code_len = codelen;
len_count[codelen]++;
}
// 計算特定碼長的所有元素中最小的編碼,這里使用的是
// Canonical Huffman編碼規(guī)則,請參見相關(guān)文獻
for (int i = max_code_len - 1; i = 0; i--)
min_code[i] = (min_code[i + 1] + len_count[i + 1]) 1;
// 已知特定碼長的所有元素中最小的編碼,同樣碼長的元素,
// 編碼逐個加1就可以了
codes.clear();
for (int i = 0; i num; i++)
if (code_lens[i] 0 (unsigned long)code_lens[i] = sizeof(unsigned long)*8)
codes.push_back(min_code[code_lens[i]]++);
else
codes.push_back(0);
}
bool verify()
{
check();
int max = 0;
const int code_len_limit = 100; // 這里能檢驗的最大碼長是100
int len_count[code_len_limit + 1];
memset(len_count, 0, sizeof(int)*(code_len_limit+1));
for(int i = 0; i (int)code_lens.size(); i++)
{
if (code_lens[i] code_len_limit)
return true; // 如果有超長碼,就不檢驗了
len_count[code_lens[i]]++;
if (code_lens[i] max) max = code_lens[i];
}
// 從根開始,算每層分支結(jié)點數(shù)目,如果最后一層不為0,就表明Huffman樹有錯誤
int nonleaf = 1;
for(int i = 1; i = max; i++)
nonleaf = nonleaf * 2 - len_count[i];
return (nonleaf == 0);
}
//主函數(shù)
void generate_codes(int num, const unsigned long* weights)
{
if (num = 1 || weights == NULL)
throw new huffman_exception("參數(shù)非法");
int heap_num, i, nonzero_count;
// 分配生成Huffman樹時使用的堆結(jié)構(gòu),其大小是元素數(shù)目的2倍
unsigned long* heap = new unsigned long[2*num];
if (heap == NULL) throw new huffman_exception("內(nèi)存不足");
// 將所有元素權(quán)值值(葉子結(jié)點)復制到堆的后半部分,堆的前半部分置0
memcpy(heap + num, weights, sizeof(unsigned long)*num);
memset((char *)heap, 0, num * sizeof (*heap));
// 將堆的前半部分視作指針,按順序指向后半部分的葉子結(jié)點
// 同時統(tǒng)計權(quán)值非0的葉子結(jié)點數(shù)目
for (nonzero_count = i = 0; i num; i++)
if (heap[num + i])
heap[nonzero_count++] = num + i;
/* 將堆的前半部分視作指針,按照指針所指的權(quán)值大小,把堆的前半部分組織成為
堆排序(Heap Sort)算法中定義的"堆",即:堆對應一棵完全二叉樹,且所有非葉
結(jié)點的值均不大于其子女的值,根結(jié)點的值是最小的.在這里,根結(jié)點是heap[0]
參見數(shù)據(jù)結(jié)構(gòu)或算法書籍中的堆排序(Heap Sort)算法介紹 */
heap_num = nonzero_count;
for (i = heap_num / 2; i 0; i--)
{
register int curr, child;
curr = i;
child = curr * 2;
while (child = heap_num)
{
if (child heap_num heap[heap[child]] heap[heap[child - 1]])
child++;
if (heap[heap[curr - 1]] heap[heap[child - 1]])
{
register unsigned long temp;
temp = heap[child - 1];
heap[child - 1] = heap[curr - 1];
heap[curr - 1] = temp;
curr = child;
child = 2 * curr;
}
else
break;
}
}
/* 創(chuàng)建Huffman樹
這里,創(chuàng)建Huffman樹的過程利用了堆排序(Heap Sort)算法的基本原理,即根結(jié)點是
最小的元素,樹中最后一個元素是最大的元素.選出根結(jié)點后,把最后的元素調(diào)到根
結(jié)點,從樹根到樹葉,讓最后的元素移動到合適的位置,重新建成堆.這樣,總是可以
找出2個最小的子樹,將這兩個子樹合并后,再作為新元素放到堆中.所有子樹都合并
后,Huffman樹就建成了.(參見數(shù)據(jù)結(jié)構(gòu)或算法書籍中的堆排序算法介紹)
這一段代碼的運行結(jié)果是整個heap數(shù)組成了一棵Huffman樹,heap[0]未用,樹根是
heap[1],其中保存所有權(quán)值值的總和, heap[2]..heap[num-1]對應于所有根以外
的分支結(jié)點,其中保存的是雙親結(jié)點的索引值, heap[num]..heap[num*2-1]對應于所
有葉子結(jié)點(即所有要編碼的元素),其中保存的是雙親結(jié)點的索引值 */
/* 當用于堆排序的二叉樹中還有結(jié)點時循環(huán) */
while (heap_num 1)
{
int pos[2];
/* 循環(huán)2次,找出2個最小的子樹,存入pos中 */
for (i = 0; i 2; i++)
{
register int curr, child;
/* 根結(jié)點就是最小的結(jié)點 */
pos[i] = heap[0];
/* 將最后的結(jié)點移動到根結(jié)點處,總結(jié)點數(shù)目減1 */
heap[0] = heap[--heap_num];
/* 以下是重建堆的過程 */
curr = 1;
child = 2;
while (child = heap_num)
{
if (child heap_num
heap[heap[child]] heap[heap[child - 1]])
child++;
if (heap[heap[curr - 1]] heap[heap[child - 1]])
{
register int temp;
temp = heap[child - 1];
heap[child - 1] = heap[curr - 1];
heap[curr - 1] = temp;
curr = child;
child = 2 * curr;
}
else
break;
}
}
/* 合并子樹,其結(jié)果作為新的結(jié)點放入堆中(但不在堆排序的二叉樹內(nèi),實際
上,新加入的結(jié)點是和堆的后半段一起構(gòu)成了Huffman樹) */
heap[heap_num + 1] = heap[pos[0]] + heap[pos[1]];
/* 子樹的左,右分支都指向子樹的根結(jié)點 */
heap[pos[0]] = heap[pos[1]] = heap_num + 1;
/* 把子樹根結(jié)點作為葉子結(jié)點,放到堆排序中的二叉樹內(nèi) */
heap[heap_num] = heap_num + 1;
{
/* 在堆中,讓新加入的葉子結(jié)點上升到合適的位置,不破壞堆的秩序 */
register int parent, curr;
heap_num++;
curr = heap_num;
parent = curr 1;
while (parent heap[heap[parent - 1]] heap[heap[curr - 1]])
{
register int temp;
temp = heap[parent - 1];
heap[parent - 1] = heap[curr - 1];
heap[curr - 1] = temp;
curr = parent;
parent = curr 1;
}
}
}
// 從根出發(fā),求每個編碼的碼長
code_lens.clear();
heap[0] = (unsigned long)(-1l); // 雙親結(jié)點為0的葉子,可由此算得碼長0
heap[1] = 0; // 根結(jié)點碼長為0
for (i = 2; i 2*num; i++)
heap[i] = heap[heap[i]] + 1; // 結(jié)點碼長等于雙親結(jié)點碼長加1
for (i = num; i 2*num; i++)
code_lens.push_back(heap[i]);
// 由碼長得到canonical huffman編碼
generate_canonical_codes();
delete[] heap;
}
generate_codes()為主函數(shù)
還要改改,,,
#includestdio.h
#define?L?100
int?main(void)
{
char?s1[2*L],?s2[L],?*p;
scanf("%s%s",?s1,?s2);
int?i,?j,?off;
off=1;
for(i=0;?s1[i]!='\0';?i++)?{
p=s2;
if(s1[i]==*p)
for(j=i;?*p!='\0';?j++)?{
前銷if(s1[j]!=*p)?{
off=EOF;
break;
}
else
off=1;
皮悔棚?????p++;
}
else
off=EOF;
if(off!=EOF)?{
燃則???off=0;
i++;
printf("%d",?i);
break;
}
}
if(off==EOF)
printf("s1中沒有找到s2");
return?0;
}
名稱欄目:c語言lens函數(shù) c語言 len函數(shù)
本文來源:http://chinadenli.net/article41/dspjded.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供面包屑導航、虛擬主機、品牌網(wǎng)站建設、網(wǎng)站收錄、靜態(tài)網(wǎng)站、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)