C中的链接列表和二进制数据

时间:2012-07-17 09:40:39

标签: c list linked-list mask binary-data

我正在尝试为以下函数编写一个简单的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的新手,试图自己动手,我会真正推荐提示和更正。非常感谢。

1 个答案:

答案 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。