个人链表学习笔记而已,不是题解,这题简单到不需要题解。

个人理解:

链表的一个结点携带的内容是由定义链表的结构体内部成员决定的。

必须要至少含有一个指针来指示连接方向。

创建链表的一个结点需要:

  • 先定义一个链表结点,顺便设置头结点位置(指向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);
    }
    
    
    
}