char data
holds a single character. That's not what you want, right? You want to hold a string, i.e. a pointer to the first character:
struct node {
char *data;
struct node* next;
};
This holds the string through a pointer - it's not clear whether you want this pointer to be an owning pointer (i.e. if node goes away then the string goes away too), or a reference (i.e. someone else owns the string and manages its lifetime).
There are other mistakes as well, but that'd be a good starting point. And enable all the warnings from the compiler, and understand them all because in case if your code, most of them are really bugs that the C language allows (since it can't be sure what you really wanted) - but that doesn't mean that the code is correct.
Another way of holding the string may be by value, i.e. instead of having just one character like you did in your answer, you may hold an array of those - see another answer to this question for how to do that. The choice between owning a string via a pointer vs. owning it as a value is of little importance in introductory teaching code where you don't measure the performance of the data structure in a real-life use case. So there's no "one true choice": each one has benefits in certain use cases.
Some vague recommendations (always subject to measurements!) may be:
if the values are constant, then holding the string by value as either a fixed size or variable size usually wins in performance
if the values have a small range of sizes (e.g. all strings are "short"), then having a fixed size node and allocating it in a contiguous memory pool may improve performance
if the values change, then holding the string by value is not always feasible: the node may need to be reallocated to resize it, and then you need a doubly-linked list to adjust to pointers of neighboring nodes to reflect the new address of the node
the most generic and potentially worst performing option is to hold the string via an owning pointer, so the node can stay at a fixed address, but the string can move; in that case a small string optimization may improve things further if there're lots of small strings: hold the string inside the node's fixed-size char array if it fits there, but otherwise allocate it in a separate memory block; that's what's typically done in implementations of std::string
and it improves performance. The thinking is that since the string is "big", then the overhead to of having to reference some other address to get at its data will be minuscule compared to whatever work is then done with the actual value of that string.