第一种传统链表
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完全没有关系,换一个内容的链表也可以使用
这种链表的通用性就很强,我们可以称之为 通用链表