【发布时间】:2014-11-02 07:40:41
【问题描述】:
我正在尝试编写用于编码和解码目的的代码。一旦我们有了字典,形成的字典就会存储在结构数组中。结构如下
typedef struct Tuple {
char a;
char* cod;
} result;
原来的字符串是字符数组
char str[100];
现在我们需要一个方法来比较原始数组中的字符和形成的字典。 形成的字典是这样的
a ---0
b ---1
c ---01
示例:原始字符串为aabcab,则编码应为0010101
将字符串与字典数据进行比较的代码如下,但是当代码执行时,结果如下:[警告]传递'strcmp'的参数2使指针从整数而不进行强制转换[默认启用] .
我们将不胜感激。
for(i=0; i<strlen(str);i++)//read the original string;
{
j=0;
while(j<number_of_elements_in_dictionary)// for above example=3
{
if (strcmp(str[i],values[j]->a)==0) //compare original string character with the //dictionary
{
printf("%s", values[j]->cod);//print corresponding code from //dictionary
j++; //check with the next value of the dictionary
}
}
}
printf("last=%s", str_en);//To print the dictionary data corresponding to //the original string data
#include<string.h>
#include<stdio.h>
#include<limits.h>
#include<stdlib.h>
typedef struct node
{
char ch;
int freq;
struct node *left;
struct node *right;
}node;
typedef struct Tuple {
char a;
char* cod;
}result;
/*Declaring heap globally so that we do not need to pass it as an argument every time*/
/* Heap implemented here is Min Heap */
node * heap[1000000];
result * values[200];
int heapSize;
char * str;
char str_en[100];
// str_en[0] = '\0';
/*Initialize Heap*/
void Init()
{
heapSize = 0;
heap[0] = (node *)malloc(sizeof(node));
heap[0]->freq = -INT_MAX;
}
/*Insert an element into the heap */
void Insert(node * element)
{
heapSize++;
heap[heapSize] = element; /*Insert in the last place*/
/*Adjust its position*/
int now = heapSize;
while(heap[now/2] -> freq >= element -> freq)
{
heap[now] = heap[now/2];
now /= 2;
}
heap[now] = element;
}
node * DeleteMin()
{
/* heap[1] is #ifndef
#elif
#endifthe minimum element. So we remove heap[1]. Size of the heap is decreased.
Now heap[1] has to be filled. We put the last element in its place and see if it fits.
If it does not fit, take minimum element among both its children and replaces parent with it.
Again See if the last element fits in that place.*/
node * minElement,*lastElement;
int child,now;
minElement = heap[1];
lastElement = heap[heapSize--];
/* now refers to the index at which we are now */
for(now = 1; now*2 <= heapSize ;now = child)
{
/* child is the index of the element which is minimum among both the children */
/* Indexes of children are i*2 and i*2 + 1*/
child = now*2;
/*child!=heapSize beacuse heap[heapSize+1] does not exist, which means it has only one
child */
if(child != heapSize && heap[child+1]->freq < heap[child] -> freq )
{
child++;
}
/* To check if the last element fits ot not it suffices to check if the last element
is less than the minimum element among both the children*/
if(lastElement -> freq > heap[child] -> freq)
{
heap[now] = heap[child];
}
else /* It fits there */
{
break;
}
}
heap[now] = lastElement;
return minElement;
}
void encode(result *value, int s)
{
int pos,i,j;
pos=1;
values[pos]=value;//Im here
values[pos]->a =value->a;
values[pos]->cod=value->cod;
printf("RESULT= %c and %s", values[pos]->a, values[pos]->cod);
pos++;
/*the problem exists here while executing the following for-loop, the code doesn't execute due to this for loop*/
for(i=0; i<strlen(str);i++){
j=0;
while(j<4)
{
if(str[i]==values[j]->a)
{
printf("%s", values[j]->cod);
j++;
}
} }
printf("last=%s", str_en);
}
void print(node *temp,char *code, int s)//, char *buf)
{
int i,pos=1,j;
if(temp->left==NULL && temp->right==NULL)
{
printf("\n\nchar %c code %s\n",temp->ch,code);
result * value = (result *) malloc(sizeof(result));
value->a=temp->ch;
value->cod= code;
encode(value,s);
return;
}
int length = strlen(code);
char leftcode[512],rightcode[512];
strcpy(leftcode,code);
strcpy(rightcode,code);
leftcode[length] = '0';
leftcode[length+1] = '\0';
rightcode[length] = '1';
rightcode[length+1] = '\0';
print(temp->right,rightcode,s);
print(temp->left,leftcode,s);
}
/* Given the list of characters along with their frequencies, our goal is to predict the encoding of the
characters such that total length of message when encoded becomes minimum */
int main()
{
char buf[250];
char character[26];
int i = 0,j=0,count[26]={0};
char c = 97;
Init();
int distinct_char=0 ;
char ch;
int freq;
int iter;
printf("enter the string");
scanf("%s", str);
printf("string=%s",str);
for (i=0; i<strlen(str);i++)
{
for(j=0;j<26;j++)
{
if (tolower(str[i]) == (c+j))
{
count[j]++;
}
}
}
for(j=0;j<26;j++)
{
if(count[j]>0)
{
printf("\n%c -> %d",97+j,count[j]);
distinct_char++;
character[j] = 97+j;
}
}
printf("\n number of distinct_characters=%d\n", distinct_char);
if(distinct_char==1)
{
printf("char %c code 0\n",c);
return 0;
}
for(j=0;j<distinct_char;j++)
{
printf("\ncharacter= %c and the frequency=%d", character[j],count[j]);
node * temp = (node *) malloc(sizeof(node));
temp -> ch = character[j];
temp -> freq = count[j];
temp -> left = temp -> right = NULL;
Insert(temp);
}
for(i=0;i<distinct_char-1 ;i++)
{
node * left = DeleteMin();
node * right = DeleteMin();
node * temp = (node *) malloc(sizeof(node));
temp -> ch = 0;
temp -> left = left;
temp -> right = right;
temp -> freq = left->freq + right -> freq;
Insert(temp);
}
node *tree = DeleteMin();
char code[512];
code[0] = '\0';
print(tree,code, distinct_char);
}
【问题讨论】:
-
您的代码中没有
strcmp。向我们展示确切的代码。 -
@vmp 请提供生成警告的代码。我在您的代码中没有看到
strcmp。 -
while(ja)==0) { printf("%s", values[j]->鳕鱼); j++; } }
标签: c arrays string structure string-comparison