第一种传统链表
struct List { char *data; List *Next; };
在自己里面包含next引用 ,下面是创建和遍历
List& CreateNode( char *data,List *next) { List *node = (List *)malloc(sizeof(List)); int len = strlen(data) + 1; node->data = (char *)malloc(len); strcpy(node->data, data); node->Next = next; return *node; } void PrintList(List *Head) { List *tmp = Head->Next; while(tmp!= NULL) { printf("%s\n", tmp->data); tmp = tmp->Next; } } int main() { List node3 = CreateNode((char*)"我是第三个", NULL); List node2 = CreateNode((char*)"我是第二个", &node3); List node1 = CreateNode((char*)"我是第一个", &node2); List Head; Head.Next = &node1; PrintList(&Head); return 0; }
这种链表使用方便,但是拓展性不强,一般框架里面是不会使用这种链表,而是下面这种
struct Node { Node* Next; }; struct Teacher { //将节点放在首位,跟Teacher地址重叠,就可以直接强转为Teacher Node node; int age; }; //此代码完全跟Teacher无关,只要是里面有Node这个结构体的结构体,都可以求出来下一个节点 Node* GetNextNode(Node *node) { return node->Next; } int main() { Teacher t1, t2; t1.age = 10; t2.age = 20; t1.node.Next = &t2.node; Teacher *pt2 = (Teacher *)GetNextNode(&t1.node); printf("%d\n", pt2->age); return 0; }
可以看出GetNextNode这个方法跟Teacher完全没有关系,换一个内容的链表也可以使用
这种链表的通用性就很强,我们可以称之为 通用链表