#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Structure definitions
// Node in doubly-linked list
typedef struct DLN {
struct DLN *prev; // Pointer to previous list element
struct DLN *next; // Pointer to next list element
char *word;
} DLNode;
// Actual doubly-linked list
typedef struct {
DLNode *firstNode; // Pointer to first node in list
DLNode *lastNode; // Pointer to last node in list
} DLList;
// Function prototypes
void addNode(DLList *list, const char *str) {
DLNode *newNode = (DLNode*)malloc(sizeof(DLNode));
if (newNode == NULL) {
fprintf(stderr, "Error:Could not allocate new node\n");
exit(0);
}
//list is empty, add one node
if ((list->firstNode == NULL) && (list->lastNode == NULL)) {
list->firstNode = newNode;
list->lastNode = newNode;
newNode->next=NULL;
newNode->prev=NULL;
newNode->word = (char*)malloc(strlen(str) + 1);
if (newNode->word == NULL) {
fprintf(stderr, "Error:Could not allocate new string for node\n");
exit(0);
}
strcpy(newNode->word, str); // newNode->word is large enough, so this is safe.
}
}
int main(void) {
DLList list = { NULL, NULL };
addNode(&list, "Worddhfkjsdfhaskjlfhadskjfl");
puts(list.firstNode->word);
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKLy8gU3RydWN0dXJlIGRlZmluaXRpb25zCi8vIE5vZGUgaW4gZG91Ymx5LWxpbmtlZCBsaXN0Cgp0eXBlZGVmIHN0cnVjdCBETE4gewogICAgc3RydWN0IERMTiAqcHJldjsgICAgICAgLy8gUG9pbnRlciB0byBwcmV2aW91cyBsaXN0IGVsZW1lbnQKICAgIHN0cnVjdCBETE4gKm5leHQ7ICAgICAgIC8vIFBvaW50ZXIgdG8gbmV4dCBsaXN0IGVsZW1lbnQKICAgIGNoYXIgKndvcmQ7Cn0gRExOb2RlOwoKLy8gQWN0dWFsIGRvdWJseS1saW5rZWQgbGlzdAp0eXBlZGVmIHN0cnVjdCB7CiAgICBETE5vZGUgKmZpcnN0Tm9kZTsgIC8vIFBvaW50ZXIgdG8gZmlyc3Qgbm9kZSBpbiBsaXN0CiAgICBETE5vZGUgKmxhc3ROb2RlOyAgIC8vIFBvaW50ZXIgdG8gbGFzdCBub2RlIGluIGxpc3QKfSBETExpc3Q7CgovLyBGdW5jdGlvbiBwcm90b3R5cGVzCgp2b2lkIGFkZE5vZGUoRExMaXN0ICpsaXN0LCBjb25zdCBjaGFyICpzdHIpIHsKICAgIERMTm9kZSAqbmV3Tm9kZSA9IChETE5vZGUqKW1hbGxvYyhzaXplb2YoRExOb2RlKSk7CgogICAgaWYgKG5ld05vZGUgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6Q291bGQgbm90IGFsbG9jYXRlIG5ldyBub2RlXG4iKTsKICAgICAgICBleGl0KDApOwogICAgfQogICAgCiAgICAvL2xpc3QgaXMgZW1wdHksIGFkZCBvbmUgbm9kZSAKICAgIGlmICgobGlzdC0+Zmlyc3ROb2RlID09IE5VTEwpICYmIChsaXN0LT5sYXN0Tm9kZSA9PSBOVUxMKSkgewogICAgICAgIGxpc3QtPmZpcnN0Tm9kZSA9IG5ld05vZGU7CiAgICAgICAgbGlzdC0+bGFzdE5vZGUgPSBuZXdOb2RlOwogICAgICAgIG5ld05vZGUtPm5leHQ9TlVMTDsKICAgICAgICBuZXdOb2RlLT5wcmV2PU5VTEw7CgogICAgICAgIG5ld05vZGUtPndvcmQgPSAoY2hhciopbWFsbG9jKHN0cmxlbihzdHIpICsgMSk7CgogICAgICAgIGlmIChuZXdOb2RlLT53b3JkID09IE5VTEwpIHsKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjpDb3VsZCBub3QgYWxsb2NhdGUgbmV3IHN0cmluZyBmb3Igbm9kZVxuIik7CiAgICAgICAgICAgIGV4aXQoMCk7CiAgICAgICAgfQoKICAgICAgICBzdHJjcHkobmV3Tm9kZS0+d29yZCwgc3RyKTsgLy8gbmV3Tm9kZS0+d29yZCBpcyBsYXJnZSBlbm91Z2gsIHNvIHRoaXMgaXMgc2FmZS4KICAgIH0KfQoKaW50IG1haW4odm9pZCkgewoJRExMaXN0IGxpc3QgPSB7IE5VTEwsIE5VTEwgfTsKCWFkZE5vZGUoJmxpc3QsICJXb3JkZGhma2pzZGZoYXNramxmaGFkc2tqZmwiKTsKCXB1dHMobGlzdC5maXJzdE5vZGUtPndvcmQpOwp9Cg==