伪代码:
创建结点

创建头结点(单独定义一个结构体来保存单链表的首地址和尾地址还有链表的长度)

创建带头结点的单链表

注意:创建头结点中的首尾指针都要指空,长度等于0;
从终端接收数据

创建结点保存数据: 创建的节点的 next要指空

插入节点:如果是第一个节点那么就将头结点的首尾指针都指向这个结点 (判断条件可以是链表的长度,也可是首尾结点是否为空 是 head->next为不为空 ),如果不为空,尾结点的next指向新节点,让新节点成为尾结点

// 创建节点
typedef struct node
{int date;struct node* next;
}node;// 创建头结点
typedef struct
{node* first; // 创建节点接收单链表的首地址node* last; // 接收点链表的尾地址int length;}head;/* CreatLinkListhead:创建一个带头结点的单链表
*/
head* CreatLinkListhead()
{// 创建头结点head* h= malloc(sizeof(head));h->first=h->last=NULL;h->length=0;while (1){// 从中断获取数据int d;scanf("%d",&d);if(d==0){break;}// 创建一个节点去接收数据node *p= malloc(sizeof(node));p->next=NULL;p->date=d;// 插入到链表中if(h->length==0){h->first=h->last=p;}else{h->last->next=p;h->last=p;}h->length++;}return h;
}
创建不带头结点的单链表:
需要定义首指针(相当于标记作用,用来标记头的),尾指针
定义后需要指空

从终端输入数据
创建结点接收数据
判断结点是否为空插入节点(条件是此时的首尾指针为空)
node* CreatLinkList()
{// 创建头指针,尾指针node *first=NULL;node* last=NULL;// 重终端输入数据int d;while (1){scanf("%d",&d);if(d==0){break;}// 创建新节点接收数据node* p= malloc(sizeof(node));p->date=d;p->next=NULL;if(first==NULL){last=first=p;}else{ last->next=p;last=p;}}return first;}
打印链表的函数: 从链表的首节点开始打印的 若创建的是带头点的单链表 需要传入 head->next

主函数里面 创建的带头的单链表 就用一个 头指针去接收 创建的不带头的 就用头指针去接受

全部代码:
#include<stdio.h>
#include<stdlib.h>typedef int Elempty;// 创建节点
typedef struct node
{int date;struct node* next;
}node;// 创建头结点
typedef struct
{node* first; // 创建节点接收单链表的首地址node* last; // 接收点链表的尾地址int length;}head;/* CreatLinkListhead:创建一个带头结点的单链表
*/
head* CreatLinkListhead()
{// 创建头结点head* h= malloc(sizeof(head));h->first=h->last=NULL;h->length=0;while (1){// 从中断获取数据int d;scanf("%d",&d);if(d==0){break;}// 创建一个节点去接收数据node *p= malloc(sizeof(node));p->next=NULL;p->date=d;// 插入到链表中if(h->length==0){h->first=h->last=p;}else{h->last->next=p;h->last=p;}h->length++;}return h;
}node* CreatLinkList()
{// 创建头指针,尾指针node *first=NULL;node* last=NULL;// 重终端输入数据int d;while (1){scanf("%d",&d);if(d==0){break;}// 创建新节点接收数据node* p= malloc(sizeof(node));p->date=d;p->next=NULL;if(first==NULL){last=first=p;}else{ last->next=p;last=p;}}return first;}void PrintList(node* list)
{while (list){printf("%d",list->date);list=list->next;}}int main(int argc, char const *argv[])
{#if 0head *list =CreatLinkListhead(); // 创建带头结点的链表PrintList(list->first); // 传入链表的首节点#endif#if 1node *list =CreatLinkList(); // 创建不带头结点的链表PrintList(list); // 传入链表的首节点#endifreturn 0;
}
创建带头结点的单链表也可以用一个函数来创建

在创建头结点的时候也可以直接在函数中创建头结点,在判断的时候便是 head->next 为空新节点就接在后面
总结: 带不带头结点就看要不要多生成一个节点,头结点需要开辟空间,判断的时候就从头结点的下一位判断 : 若不带头结点,就生成一个头指针,将第一个节点赋值给头指针,
打印链表: 是从第一个节点开始打印的



















