个人链表学习笔记而已,不是题解,这题简单到不需要题解。
个人理解:
链表的一个结点携带的内容是由定义链表的结构体内部成员决定的。
必须要至少含有一个指针来指示连接方向。
创建链表的一个结点需要:
-
先定义一个链表结点,顺便设置头结点位置(指向NULL)。
-
向内存申请空间(一个链表结点所占的空间)。
-
初始化。
-
向链表结点中写入数据。
-
向链表结点中写入首地址(头结点)。
-
- 当创建下一个结点时,指向的正好是链表末尾。
尾插函数同样思想。
- 先设定一个新的结点名用于存储新结点中包含的信息。
- 设定一个新结构体访问头结点的位置,这个位置信息是由创建结点函数的返回值确定的。(链表开始的地方,不变,每次访问都是0x0)。
- 从头结点开始遍历,判断是否为最后一个结点。(标志:最后一个结点的下一个结点指向NULL。)
-
- 如果不是,则把结点首地址赋为该结点的下一个结点。
-
- 再重新访问,直到最后一个结点。(此处需要一个while循环)
- 到最后一个结点,它的下一个结点指向NULL,跳出循环,把新收到的结点赋给把最后一个结点,完成插入。
- 结束后加一个count++可以用于计算链表长度或者尾插次数。
本题需要注意的是尾插函数的返回值,这个是由题目之中的输出要求得到的。
如果不需要输出,返回值也可以是0。
#include<stdio.h>
#include<stdlib.h>
int N,val;
struct ListNode
{
int data;
struct list_node *next;
};
typedef struct ListNode set;//链表结构体起别名
set *creat_list_node(int r_data)//创建一个链表结点
{
set *creat_node=NULL;//头结点
creat_node=(set*)malloc(sizeof(set));//申请空间
memset(creat_node,0,sizeof(set));//清零
creat_node->data=r_data;//写入数据
creat_node->next=NULL;//写入地址
return creat_node;
}
set *tail_node(set *Headnode, int t_data)//尾插函数
{
set *new_node=creat_list_node(t_data);//将要插入的内容
set *insert_node=Headnode;//确定头结点位置
while(insert_node->next!=NULL)//判断是否为表尾
{
insert_node=insert_node->next;//如果不是,指向下一个。
}
insert_node->next=new_node;//新结点的内容写入末尾结点的下一个。
return insert_node->data; //返回新插入表中的值
}
int main()
{
while(scanf("%d\n",&N)!=EOF)
{
set *Headnode=creat_list_node(N);//确定头结点位置
for(int i=0;i<N;i++)
{
scanf("%d\n",&val);//收
tail_node(Headnode, val);//插
printf("%d ",tail_node(Headnode,val));//输出
}
printf("\n");
//free(*Headnode);
}
}