1,使用头指针的方式,不创建头结点
1 /*尾插入实现方法2*/ 2 #include<stdio.h> 3 #include<stdlib.h> 4 5 //链表中节点的结构 6 typedef struct Link { 7 int data; 8 struct Link* next; 9 }link; 10 11 //链表初始化 12 link* initByTailInsert() { 13 link* phead = NULL;//创建头指针 14 link* first_node = (link*)malloc(sizeof(link));//创建第一个节点 15 //第一个结点先初始化 16 first_node->data = 1; 17 first_node->next = NULL; 18 phead = first_node;//头指针指向第一个节点 19 20 //尾插入赋值 21 for (int i = 2; i < 5; i++) { 22 link* new_node = (link*)malloc(sizeof(link)); //申请新的结点 23 new_node->data = i; 24 new_node->next = NULL; 25 first_node->next = new_node; //第一个结点的指针域指向这个新申请的结点 26 first_node = new_node; //第一个结点后移 27 } 28 29 printf("头指针指向的值是:%d ", phead->data);//1 30 return phead; //将指向第一个结点的头指针返回 31 } 32 33 34 35 void showLink(link* phead) { 36 link* tmp = phead;//将头指针赋给tmp,tmp也是一个头指针 37 //只要tmp指针指向的结点的next不是Null,就执行输出语句。 38 while (tmp!=NULL) { 39 printf("%d ", tmp->data); 40 tmp = tmp->next; 41 } 42 printf(" "); 43 } 44 45 void main() { 46 //初始化链表(1,2,3,4) 47 printf("初始化链表为: "); 48 link* phead = initByTailInsert(); //创建头指针,得到经过初始化后的头指针 49 showLink(phead); 50 }
使用创建头结点的方式:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct Link { 5 int data; 6 struct Link* next; 7 }link; 8 9 10 link* initLink(link* headNode) { 11 headNode = (link*)malloc(sizeof(link)); //头结点 12 headNode->next = NULL; 13 headNode->data = -1; //头结点的数据域给值是 -1 14 15 link* headNode2 = headNode; //复制一个头结点 16 17 for (int i = 1; i <= 10; i++) { 18 link* new_node = (link*)malloc(sizeof(link)); 19 new_node->data = i; 20 new_node->next = NULL; 21 headNode2->next = new_node; 22 headNode2 = new_node; 23 } 24 25 return headNode; 26 } 27 28 29 void showLink(link* headNode) { 30 link* temp = headNode; 31 while (temp != NULL) { 32 printf("%d ", temp->data); 33 temp = temp->next; 34 } 35 printf(" "); 36 } 37 38 void main() { 39 link* head_node = NULL; 40 head_node = initLink(head_node); //获取经过初始化后的双向链表的头结点 41 printf("初始化单链表是: "); 42 showLink(head_node); 43 44 }