#include<stdio.h>
#include<stdlib.h>
//什么是链表?
//链表就是多个结构体连接在一起形成的聚合体
//要让多个结构链接在一起,并且可以记录数据,所以结构体可以构建如下
typedef struct NODE
{
int value; //为了存放数据
struct NODE* next; //为了能指向下一个相同的结构体
}node;
链表结构体构建完成之后就需要创建链表
int main(int argc, const int* argv[])
{
node* head = NULL; //定义第一个链表中的结构体,因为现在链表里面什么都没有,所以是指向NULL
int number; //接下来要向链表之中插入数据
do
{
scanf("%d", &number);
node* p = (node*)malloc(sizeof(node));//设一个结构体来装这个number
p->next = NULL; //因为我们要把这个结构体放在链表最后面,所以这个结构体中的指针指向NULL
p->value = number;
if (head==NULL) //如果head这时候是空的,也就是说这个链表什么都没有的时候,那么要让head等于p
{
head = p;
}
else
{
node* last = head; //因为要把p放在链表最后,所以得找到最后一个结构,把p接在后面,所以这里设一个last
while (last->next != NULL)
{
last = last->next;//先将last设置为第一个结点,当last中的next指向的节点存在的时候,last就是下一个节点
//循环结束后,last所指的结点就是最后一个节点,所以接下来要把p接在last后面
}
last->next = p;
}
} while (number!=-1);
}
之后将加入链表设置为一个函数:nodeadd,那么主函数如下:
我们想让nodeadd有这样的功能,给他一个数,再给他一个链表,他就可以把这个数加入这个链表,所以设置的两个函数为number和pnode,pnode下面讲;
int main(int argc, const int* argv[])
{
node* head = NULL; //定义第一个链表中的结构体,因为现在链表里面什么都没有,所以是指向NULL
int number; //接下来要向链表之中插入数据
do
{
scanf("%d", &number);
nodeadd(number, pnode)
} while (number!=-1);
}
因为如果传递的是一个node*head,那么会在nodeadd函数内有一个node*head的本地变量,对于主函数的head不会起作用,所以可以定义如下结构体
typedef struct Phead
{
node* head;
node* tral;
}phead;
其中,第一个node*head指向链表的头部方便我们找到这个链表,另一个node*tral指向链表尾部,方便我们给链表添加结点,那么主函数可以写成下面这样
int main(int argc, const int* argv[])
{
phead pnode;
pnode.head = pnode.tral = NULL;
int number; //接下来要向链表之中插入数据
do
{
scanf("%d", &number);
if (number!=-1)
{
nodeadd(number, &pnode);
}
} while (number != -1);
}
相对于上面的主函数,我们不再定义node*,而是定义phead,将phead传递过去,那么nodeadd可以写成下面这样
void nodeadd(int number, phead* pnode)
{
node* p = (node*)malloc(sizeof(node));
p->next = NULL;
p->value = number;
if (pnode->head == NULL)
{
pnode->head = p; //如果第一个结点为空,那么第一个结点等于p
pnode->tral = p; //tral也等于p
}
else
{
node* last = pnode->tral;
last->next = p;
pnode->tral = p;
}
}
上面的代码就可以让我们新定义的结点连在之前结点的后面,下面要设置函数print来遍历我们的链表,我们希望我们所设置的函数是,我们给他一个phead的函数,他能给我们遍历出这个函数所指的链表中的所有函数,所以主函数如下;
int main(int argc, const int* argv[])
{
phead pnode;
pnode.head = pnode.tral = NULL;
int number; //接下来要向链表之中插入数据
do
{
scanf("%d", &number);
if (number!=-1)
{
nodeadd(number, &pnode);
}
} while (number != -1);
print(pnode);
}
所以print函数如下
void print(phead pnode)
{
for ( ; pnode.head ; pnode.head=pnode.head->next)
{
printf("%d\t", pnode.head->value);
}
}
因为我们传递进去的不是一个指针,而是结构体,所以在print函数里改变head并不会改变主函数中的head,到此,我们完成了;链表的创建以及遍历,所有函数写在一起,如下:
#include<stdio.h>
#include<stdlib.h>
//什么是链表?
//链表就是多个结构体连接在一起形成的聚合体
//要让多个结构链接在一起,并且可以记录数据,所以结构体可以构建如下
typedef struct NODE
{
int value; //为了存放数据
struct NODE* next; //为了能指向下一个相同的结构体
}node;
typedef struct Phead
{
node* head;
node* tral;
}phead;
void nodeadd(int number, phead* pnode);
void print(phead pnode);
int main(int argc, const int* argv[])
{
phead pnode;
pnode.head = pnode.tral = NULL;
int number; //接下来要向链表之中插入数据
do
{
scanf("%d", &number);
if (number!=-1)
{
nodeadd(number, &pnode);
}
} while (number != -1);
print(pnode);
print(pnode);
}
void print(phead pnode)
{
for ( ; pnode.head ; pnode.head=pnode.head->next)
{
printf("%d\t", pnode.head->value);
}
}
void nodeadd(int number, phead* pnode)
{
node* p = (node*)malloc(sizeof(node));
p->next = NULL;
p->value = number;
if (pnode->head == NULL)
{
pnode->head = p; //如果第一个结点为空,那么第一个结点等于p
pnode->tral = p; //tral也等于p
}
else
{
node* last = pnode->tral;
last->next = p;
pnode->tral = p;
}
}
注意:如果最后的print函数要传入指针的话,需要在print函数中新建一个node*以代替phead函数做遍历,否则就会改变phead函数,这里的话,因为结构体里面全是指针,所以我直接传的结构体。