上一篇博客中,介绍到两种初始方式,用返回值来初始化,用二级指针来初始链表
今天着重介绍二级指针初始化链表
typedef struct _node {
int data;
struct node* next;
}node,*linklist;//node为结构体,linklist为指向结构体的指针
这里,我们通过重定义一个指针类型*linklist,指向结构体,在主函数中给他重命名为L
linklist L;//指向结构体指针的地址命名为L
因此,就可以通过*L(二级指针)对链表内容初始化了。
初始化函数:
void init(linklist *L) {
*L = (linklist)malloc(sizeof(node));//给linklist的指针分配内存空间,使得*L可以访问
(*L)->next = NULL;//指向头节的下一个节点(真正的节点)
}
*L里面存放的是node的地址,给*L分配动态空间,使得他可以访问链表的数据域跟指针域。+
最后其余插入方法跟输出方法基本一致
初始化图解:
最后奉上源代码:
#pragma warning (disable:4996)
#include<stdio.h>
#include<stdlib.h>
typedef struct _node {
int data;
struct node* next;
}node,*linklist;//node为结构体,linklist为指向结构体的指针
void init(linklist *L) {
*L = (linklist)malloc(sizeof(node));//给linklist的指针分配内存空间,使得*L可以访问
(*L)->next = NULL;//指向头节的下一个节点(真正的节点)
}
void addlist(linklist L,int i) {
int j = 0;
for (j; j < i; j++) {
node* p = (linklist)malloc(sizeof(node));
printf("请输入数据\n");
scanf("%d", &p->data);
p->next = L->next;
L->next = p;
}
}//头插法插入链表
void getlist(linklist L) {
node* p;
p = L->next;
while (p != NULL) {
printf("%2d", p->data);
p = p->next;//历遍链表
}
}
int main() {
int i = 0;
linklist L;//指向结构体指针的地址命名为L
init(&L);//初始化链表时需要传递结构体的地址,因此用&(取地址符号)
printf("请输入要输入的数据个数\n");
scanf("%d", &i);
addlist(L,i);
printf("数据为:\n");
getlist(L);
return 0;
}