Оба указателя должны быть установлены в что-то. name
должен либо быть установлен, чтобы указывать на строковый литерал, массив из char
, либо кусок памяти, возвращенный с malloc
или calloc
или realloc
. itself
необходимо будет установить в другой экземпляр struct node
. Нужно ли использовать динамическое распределение или нет, зависит от того, что вы пытаетесь сделать.
В односвязном списке указатель itself
будет содержать адрес другого экземпляра struct node
. Вы можете представить его как что-то вроде следующего:
+---+---+ +---+---+ +---+---+ +---+---+
| | |--->| | |--->| | |--->| | |---0
+---+---+ +---+---+ +---+---+ +---+---+
| | | |
| | | |
V V V V
+---+ +---+ +---+ +---+
|'f'| |'b'| |'b'| |'b'|
+---+ +---+ +---+ +---+
|'o'| |'a'| |'l'| |'l'|
+---+ +---+ +---+ +---+
|'o'| |'r'| |'e'| |'u'|
+---+ +---+ +---+ +---+
| 0 | | 0 | |'t'| |'r'|
+---+ +---+ +---+ +---+
|'c'| |'g'|
+---+ +---+
|'h'| |'a'|
+---+ +---+
| 0 | | 0 |
+---+ +---+
У нас есть 4 экземпляра struct node
. Элементы name
из четырех из них указывают на строки, а члены 0 из 3 из них указывают на другие экземпляры struct node
.
Теперь, независимо от того, динамически выделены ли строки или другие экземпляры узлов или нет, зависит от вашей программы.Можно выделить массив struct node
и иметь каждый элемент явно указывает на следующий по очереди:
struct node nodes[N] = {{NULL, NULL}};
for (size_t i = 0; i < N-1; i++)
nodes[i].itself = &node[i+1];
Вы можете установить каждый узел, чтобы указать на уже существующем массиве char
или строкового литерала:
char buffer[] = "foo";
node[i].name = buffer;
node[j].name = "blah";
в качестве альтернативы, вы можете выделить все динамически:
/**
* Adds a name to the head of a list
*/
void pushName(struct node **head, const char *name)
{
struct node *newNode = malloc(sizeof *newNode);
if (newNode)
{
newNode->name = malloc(strlen(name) + 1);
if (newNode->name)
strcpy(newNode->name, name);
newNode->itself = *head;
*head = newNode;
}
}
...
struct node *list = NULL;
pushName(&list, "blurga");
pushName(&list, "bletch");
pushName(&list, "bar");
pushName(&list, "foo");
, который дает нам что-то вроде приведенной выше схеме.
Все зависит от того, что вы собираетесь делать.
Пожалуйста, разместите вопрос в этом сообщении. При этом вам нужно выделить (иногда) для символа 'char *', потому что это строка стиля C и часто не должна ссылаться на внешнюю строку. – owacoder
@owacoder: 'char *' это ** ни ** строка, ** и ** a_array_! – Olaf
@Olaf - Я знаю, что это ни строка, ни массив. (Я не думал, что упоминал массивы в своем комментарии. Или я?) В этом случае, однако, он используется для имени, которое, очевидно, является ** строкой **. – owacoder