【问题标题】:List in C using (void *)使用 (void *) 在 C 中列出
【发布时间】:2013-11-16 15:12:17
【问题描述】:

任务:使用此头文件在 C (C++) 中创建列表:

#include <stdio.h>
#include <stdlib.h>

const unsigned int N = 100;
const short ListOk = 0;
const short ListNotMem = 1;
const short ListEmpty = 2;
const short ListFull = 3;

typedef void * base;
typedef struct element * ptrel;
typedef struct element {
    base data;
    ptrel next;
} element;
typedef struct{
    ptrel Start;
    ptrel ptr;
    unsigned int N;
} List;

static short ListError;

void InitList(List *L);
void PutList(List *L, base E);
void GetList(List *L, base *E);
void ReadList(List *L, base *E);
int EmptyList(List *L);
int FullList(List *L);
unsigned int Count(List *L);
void BeginPtr(List *L);
void EndPtr(List *L);
void MovePtr(List *L);
void MoveTo(List *L, unsigned int n);
void ClearList(List *L);
void CopyList(List *L1, List *L2);

所以,这就是我已经写的:

#include "list.h"

void InitList(List *L) {
    L->Start = (ptrel)malloc(sizeof(element));

    if (L->Start == NULL) {
        ListError = ListNotMem;
        return;
    } 

    L->ptr = L->Start;
    L->ptr->next = NULL;
    ListError = ListOk;
}

void PutList(List *L, base E) {
    ptrel tmp = (ptrel)malloc(sizeof(element));

    if (tmp == NULL) {
        ListError = ListNotMem;
        return;
    } 
    if (Count(L) == L->N) {
        ListError = ListFull;
        free(tmp);
        return;
    }

    tmp->data = E;
    tmp->next = L->ptr->next;
    L->ptr->next = tmp;

    L->ptr = L->ptr->next;
}

void GetList(List *L, base *E) {

    if (L->Start == NULL) {
        ListError = ListEmpty;
        return;
    }

    *E = L->ptr->next->data;
    L->ptr->next = L->ptr->next->next;
}

现在我有一些问题:

  1. 如何在主程序中使用PutList?什么是第二个参数?例如,如果我想将 5 放入列表中,我应该使用附加变量吗?像这样:x = 5; PutList(&amp;l, (base)x)。对吧?
  2. 如何使用GetList?同样,第二个参数是什么? (base)&amp;x 还是什么?

【问题讨论】:

  • 不相关:如果您认为类型定义指针指向的东西在任何情况下都不再类似于指针 except 将指针隐藏为不透明的“句柄”会以某种方式带来清晰你的代码,你不可能更错了。大多数工程师希望看到星号。也就是说,选择一种语言:C 或 C++,然后删除另一个标签。
  • @WhozCraig 你说的是void * base,对吧?这不是我的心血来潮,这是任务。我删除了 c++ 标签。
  • 关于所有个。除了在 API 中使用不透明句柄隐藏间接性之外,typedef Type *ptrType; 形式的代码的唯一原因是防止在多变量列表中意外声明。 IE。 Type* a,b; 不声明两个指针,而 ptrType a,b; 声明。但这是一个最弱的原因,因为如果您犯了Type* a,b; 错误,几乎可以保证代码不会正确编译,然后使用b 作为指向@987654333 的指针@某处。它只是一个坏习惯,实际上使代码更难阅读。抱歉,如果这是您的预先退出要求。哎哟。
  • @WhozCraig :你再正确不过了。我最近一直在使用 Glib,而且到处都看到 gpointers 而不是 void*s 真是令人困惑。

标签: c list linked-list


【解决方案1】:
  1. 你说得对,PutList 中的第二个参数应该是指向要放置的数据的指针。因此,在您的示例中,如果您要保存的数据是一个数字,您需要指向它。但请注意,您的实现似乎没有保留内存,因此您必须自己做。

  2. GetList 的第二个参数是指向结果指针的指针。当您致电GetList 时,它尚未设置。 GetList 将为您设置。

例子:

int x = 8;
List l;
PutList(l, &x);  // put a pointer to x into the list
int *y;          // y isn't set yet.
GetList(l, &y);  // now, y points to x
printf("x is %d. y points to %d.\n", x, *y);

希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2014-08-10
    • 1970-01-01
    • 2014-03-20
    • 2012-11-02
    • 2015-12-06
    • 2011-05-22
    • 1970-01-01
    相关资源
    最近更新 更多