头插法
从一个空表头指针开始,重复读入数据,生成新节点, 将读入数据存放到新节点的数据域中,永远是将新节点插入到当前链表的头节点的后面,第一个创建的节点是放在最后的,直到读入结束标志才停止创建。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{int date; //数据域 struct Node *next; //存储节点的地址
}LNode,*Linklist;Linklist Creat_list(Linklist head);void Illustrate(Linklist head)//输出每个节点的数据域 函数 {Linklist tem = head;//将头指针的地址赋给临时的指针while(tem->next != NULL)//这个临时指针的值就是头指针的地址//然后这个临时指针指向的下一个地址 不断更替为当前的临时指针所在地址 {tem = tem->next ;printf("%d\n",tem->date );} }int main()
{Linklist head = NULL; //链表的头指针//head只是一个指针,在它malloc之前,它并没有date,也没有->next printf("head=%p\n",head );head = Creat_list(head);//创建链表 ,把头指针穿进去创建链表的函数 Illustrate(head); //输出每个节点的数据域 system("pause");return 0;} /*头插法*//*从一个空表开始,重复读入数据,生成新节点,将读入数据存放到新节点的数据域中,然后将新节点插入到当前链表的表头节点之后,直到读入结束标志为止*/Linklist Creat_list(Linklist head){head = (Linklist)malloc(sizeof(LNode));//为头指针开辟内存空间if(head==NULL){printf("failure\n");exit(-1);} printf("第一次开辟head = %p\n",head );printf("第一次开辟head->next = %p\n",head->next );LNode *node = NULL;//定义新节点printf("初始化节点node=%p\n",node);int count = 0;//初始化创建节点的个数head->next = NULL;printf("初始化head->next = %p\n",head->next );node = head->next ;//将最后一个节点的指针域永远保持为NULL printf("\n"); printf("请输入节点个数:");scanf("%d",&count);for(int i = 0;i<count;i++){node = (Linklist)malloc(sizeof(LNode));//为新节点开辟内存空间printf("第%d个node = %p\n",i+1,node); printf("第%d个node->next = %p\n",i+1,node->next ); node->date = i; //为新节点的数据域赋值/*关键在于理解以下两句!!!*/node->next = head->next; //将头指针所指向的下一个节点地址赋给新创建的节点的next head->next =node; //将新创建的节点的地址赋给头指针的下一个节点 printf("新node->next = %p\n",node->next );printf("新head->next = %p\n",head->next );} return head; }
参考博文
自己再练习一下头插法
//自己练习一遍头插法
#include <stdio.h>
#include <stdlib.h>
typedef struct NODE//定义节点结构体
{int date;//数据域struct NODE *next;//指针域
}NODE;void Print_linklist(NODE *head);NODE *Create_linklist(NODE *head);
int main()
{NODE *head = NULL;//声明一个head指针为空head = Create_linklist(head);Print_linklist(head);return 0;} /*头插法就是,在头节点之后不断插入新添加的新节点node,
并且每次新加节点都要改变head->next指向的地址为新添加节点的地址,
然后还要把新添加的节点 ->next 的地址 的改为上一个创建的节点的地址,
这是头插法最关键的两步
头插法第一个创建的node为最后一个节点,指向NULL*/ NODE *Create_linklist(NODE *head){head = (NODE*)malloc(sizeof(NODE));//为头指针开辟内存 if(head == NULL){printf("failure\n");exit(-1);}NODE *node = NULL; //声明NODE结构体指针类型的新节点node并初始化 //此时head!=NULL,node=NULLhead->next = NULL;int count;printf("请输入链表节点的个数:\n");scanf("%d",&count);int i;//循环变量 for(i=0;i<count;i++){node = (NODE*)malloc(sizeof(NODE));//为新节点开辟内存 //开辟内存之后呢,该node的地址是新开辟出来的,//不过呢,它里面的->next却是不会开辟出来的哦,//每次开辟新的node里面的->next一直都会是同一个。node->date = i;node->next = head->next ;head->next = node; } return head;} void Print_linklist(NODE *head){while(head->next != NULL){head = head->next ;//head是空节点,上面没有存放date,要head的下一个才有存放数据 printf("head->date = %d\n",head->date );}}
接下来练习一下不用for,而是用while的情况,把以上代码从int count;到整个for循环结束的这块修改为
int date;printf("请为节点数据域输入整数date:\n");scanf("%d",&date);printf("当输入date为0时停止创建节点。\n");while(date) {node = (NODE*)malloc(sizeof(NODE));node->date = date;node->next = head->next ;head->next = node; scanf("%d",&date);}