我正在尝试为以下函数编写一个简单的C代码:
给出字母a-d的编码:
'a' - > 00,'b' - > 01,'c' - > 10,'d' - > 11,
和链表中的节点定义为:
typedef struct listNode{
unsigned char data;
struct listNode* next;
}ListNode;
typedef struct list{
ListNode* head;
ListNode* tail;
}List;
其中head
指向列表的第一个节点,tail
指向最后一个节点。
我需要编写一个函数char* SumList(List arr[], int n)
,它返回一个字符串,其中包含arr in行中所有列表的所有节点中的所有编码字母。
这是我到目前为止写的:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int isBitISet(char, int);
typedef struct listNode {
unsigned char data;
struct listNode* next;
} ListNode;
typedef struct list {
ListNode* head;
ListNode* tail;
} List;
int isBitISet(char ch, int i) {
char mask;
mask=1<<i;
return (mask & ch);
}
int totalNodes(List arr[], int n) {
int i;
int counter=0;
for (i=0; i<n; ++i) {
ListNode* head= arr[i].head;
while (head!=NULL) {
counter++;
head=head->next;
}
}
return counter;
}
char* whatToadd(char data) {
int a, b;
a=isBitISet(data, 0);
b=isBitISet(data, 1);
char* result;
result=(char *) calloc(2, sizeof(char));
if ((a!=0) && (b!=0))
result="d";
else if ((a!=0) && (b==0))
result="b";
else if ((a==0) && (b!=0))
result="c";
else
result="a";
return result;
}
char* SumLists(List arr[], int n) {
char* final;
int nodes=totalNodes(arr, n);
final= (char*) calloc(nodes, sizeof(char)); //how would I know the final length?//
int i;
for (i=0; i<n; ++i) {
ListNode* head= (arr[i].head);
while (head!=NULL) { //Why do I need a tail?//
char* result;
result=whatToadd(((head->data)&(00000011)));
strcat(final, result);
free(result);
result=whatToadd(((head->data)&(00001100))>>2);
strcat(final, result);
free(result);
result =whatToadd(((head->data)&(00110000))>>4);
strcat(final,result);
free(result);
result=whatToadd(((head->data)&(11000000))>>6);
strcat(final,result);
free(result);
head=head->next;
}
}
return final;
}
int main() {
.....
free(final);
...
}
可能Tail已经从某种原因给出了 - 但(1) - 我不能像我一样在列表上运行吗?没有使用尾巴?如果没有,我应该如何使用它?
(2) - 每次我从whatToAdd
获得新结果时,是否需要按照我的方式免费获得结果?
我是C的新手,试图自己动手,我会真正推荐提示和更正。非常感谢。
答案 0 :(得分:1)
我是否需要按照每次从whatToAdd获得新结果时的方式获得结果?
不,因为正在返回字符串文字的地址。不要calloc()
内存result
,因为它是不需要的。将whatToadd()
的返回值更改为const char*
,因为字符串文字是只读的。
为了澄清,以下内容未将"d"
复制到result
:
result="d";
但是让result
指向字符串文字"a"
的地址:它是一个指针赋值。如果你想复制到result
,你可以这样做:
strcpy(result, "d");
*result = 'd'; *(result + 1) = 0;
在这种情况下,您将free()
返回的指针。
如果是前一次调用free()
,calloc()
或malloc()
并且尚未realloc()
的结果,则仅指向free()
的指针d。