请教下这个用C写的海明码算法错在哪了?
请教下这个用C写的海明码算法错在哪了?#include <stdio.h>
#include <malloc.h>
#include <math.h>
#define M 100
#include <dos.h>
struct node{
int pLocation;
struct node *next;
};//存放有数据为关联的校验位的节点信息
struct data{
int value;
struct node *next;
}D[M];//存放数据位信息
struct pdata{
int value;
}P[M];//存放校验位信息
struct Hamming{
int flag;
int value;
}H[2*M];//存放海明码信息
int C[M];//存放检验位信息
int DC=0,PC=0,EC=0,HC=0,ERROR=0,ERROR1=0;//DC是数据的位数,PC是校验位的位数,不能在此更改这些数据的值,否则出错
showInf(){//显示信息
printf("-------------------------------------------------------------------------------\n");
printf("*****************************************海明码********************************\n");
printf("***************************************输入格式如下:***************************\n");
printf("*****************************如果要输入1101,需输入 1 1 0 1 2******************\n");
printf("-----------------------------选择操作:----------------------------------------\n");
printf("1 输入数据后生成海明码 2 输入海明码 3 清屏 4 纠正海明码 5 返回主页 6 结束程序\n\n");
printf("请选择操作,只能输入一个数: ");
}
int inputData(){//返回输入的数据位数
int data,i=0;
scanf("%d",&data);
if(data !=0&&data!=1){
printf("\n输入格式不正确,第一位只能是0或1,请重新选择操作\n\n");
return -1;
}
do{
D[++i].value = data;
D[i].next=NULL;
scanf("%d",&data);
}while(data!=2);
return i;
}
inputHammingCode(){//输入海明码,把校验位存在校验数组中,把数据位存在海明码数组中,
int p=1,m =1,data=1,h=1,d=1;
scanf("%d",&data);
if(data !=0&&data!=1){
ERROR=1;//当输入的格式不正确时,会给据ERROR的值给出提示信息
return ;
}
while(data!=2){
if(h ==pow(2,m-1)){
P[p++].value = data;
H[h++].flag = 1;
m++;
PC++;
}
else{
D[d++].value=data;//把数据放到数据的结构体中,再求校验位的值时,会用到数据的结构体中的值,相关联的值互相异或
H[h].flag=0;
H[h++].value = data;
D[DC++].next = NULL;
}
scanf("%d",&data);
}
if(PC+DC<3)
ERROR=2;
}
int caculatePNum(int dc){//计算校验位的个数
int pc=1;
while(pow(2,pc)<pc + dc + 1)
pc++;
return pc;
}
caculateDNext(int dc,int pc){//计算每个数据位都与那些校验位有关,并通过单链表存储
float temp;
int i,k,m,n;
struct node *p,*q;
m=3;
for(i = 1; i<=dc;i++){
p=(struct node*)malloc(sizeof(struct node));
D[i].next = p;//头结点
for(n=pc;n>=1;n--)
if(pow(2,n-1)<m){
temp = pow(2,n-1);
q=(struct node*)malloc(sizeof(struct node));
q->pLocation=n;
p->next=q;
p = p->next;
break;
}
for(k=n;k>=1;k--){
if(temp + pow(2,k-2)<m){
temp = temp + pow(2,k-2);
q=(struct node*)malloc(sizeof(struct node));
q->pLocation=k-1;
p->next=q;
p = p->next;
}
if(temp + pow(2,k-2)==m){
q=(struct node*)malloc(sizeof(struct node));
q->pLocation=k-1;
p->next=q;
q->next = NULL;
p=p->next;
break;
}
}
for(k = m+1; k<= pc + dc;k++){
if(H[k].flag==0){
m=k;
break;
}
}
}
}
initialize(int dc,int pc){//单独输入数据时,对一些结构的初始化
int i,k;
for(i=1;i<=pc + dc;i++)
H[i].flag = 0;
for(i = 1; i<=pc ;i++){
k=(int)pow(2,i-1);
H[k].flag = 1;//1表示海明码数组的当前位置放的是校验码
}
/* www. */
}
caculateHPValue(int dc,int pc){//计算校验位的值并把它存入海明码结构体数组中
int i,k,temp=0,m;
struct node *p;
for(i = 1; i<=pc; i++){
temp=0;
for(k = 1; k<=dc; k++){
p=D[k].next->next;
while(p!=NULL){
if(p->pLocation == i){
temp = temp ^ D[k].value;
break;
}
p=p->next;
}
}
m=(int)pow(2,i-1);
H[m].value = temp;//输入P[i]的内容
}
}
caculateC(int pc){//计算检验位的值
int i,k;
for(i=1;i<=pc;i++){
k = (int)pow(2,i-1);
C[i] = P[i].value^H[k].value;
}
}
inputHDvalue(int dc,int pc){//把输入的数据放到海明码结构体中
int i,j=1,m=3;
for(i=m;i<=dc+pc;i++){
if(H[i].flag==0){
H[i].value=D[j++].value;
m=i+1;
}
}
}
showHammingCode(int dc,int pc){//输入海明码结构体中的值
int i;
printf("\n海明码:\n");
for(i=1;i<=dc + pc;i++){
printf("第%d位:",i);
printf(" %d\n",H[i].value);
}
printf("\n");
}
judge(int pc){//判断出哪一位出错
int i , result =0,flag=0;
for(i=1;i<=pc;i++){
if(C[i]==1)
flag++;
}
for(i=1;i<=pc;i++){
if(flag==0)
result = result + C[i]*pow(2,pc-i);
else result = result + C[i]*pow(2,i-1);
}
if(result!=0){
printf("\n\n第%d位出错,",result);
EC=result;
if(flag>=2)
printf("这一位是数据位!\n\n");
else printf("这一位是校验位!\n\n");
}
else printf("\n海明码正确!\n\n");
}
mend(int hc){
int i;
if(EC==0){
printf("\n海明码正确或者已经纠正或者海明码为空,请重新选择操作\n\n");
return;
}
system("cls");
printf("海明码第%d位有错误\n\n纠正前的海明码是:\n\n",EC);
for(i=1;i<=hc;i++)
printf("第%d位%d\n",i,H[i].value);
H[EC].value= !(H[EC].value);
printf("\n纠正后的海明码是:\n\n");
for(i=1;i<=hc;i++)
printf("第%d位%d\n",i,H[i].value);
}
run(int command){//运行不同的操作模式
int i;
if(command==1){
printf("\n\n请输入数据,以2做结束符:");
DC = inputData();//返回输入的数据位数
if(DC==-1) return ;
PC= caculatePNum(DC);
initialize(DC,PC);
caculateDNext(DC,PC);
caculateHPValue(DC,PC);
inputHDvalue(DC,PC);
showHammingCode(DC,PC);
HC=PC + DC;
DC=0;
PC=0;
}
else {
printf("\n\n请输入海明码,以2做结束符,只能有一位错误:");
inputHammingCode();
if(ERROR==1||ERROR==2) {
printf("\n输入格式不正确,第一位只能是0或1,并且输入的位数要大于等于3。请重新选择操作\n\n");
ERROR=0;
PC=0;
return ;
}
caculateDNext(DC,PC);
caculateHPValue(DC,PC);
caculateC(PC);
judge(PC);
HC=PC + DC;
PC = 0;
DC = 0;
}
}
void main(){
int function,flag =1,command,data,errorCount,back=0;
showInf();
scanf("%d",&function);
while(flag){
switch(function){
case 1: command=1;
run(command);
break;
case 2: command = 2;
run(command);
break;
case 3: system("cls");
//printf("1 输入数据后生成海明码 2 输入海明码 3 清屏 4 纠正海明码 5 返回主页 6 结束程序\n\n");
break;
case 4: mend(HC);
EC=0;
break;
case 5: system("cls");
back = 1;
break;
case 6:exit(1);
default: printf("操作不正确,请重新选择!\n");
break;
}
if(back==1){
showInf();
back=0;
}
else {
printf("\n1 输入数据后生成海明码 2 输入海明码 3 清屏 4 纠正海明码 5 返回主页 6 结束程序\n\n");
printf("请选择操作,只能输入一个数: ");
}
scanf("%d",&function);
}
}
[ 本帖最后由 原野过客 于 2011-4-15 17:07 编辑 ]