今天给大家分享的是使用头插法创建单链表的方法和原理。
头插法顾名思义就是把每个新创建的数据单元放在头结点和首结点之间,这时,新的数据单元就成了新的首结点。原来的首结点就变成了第二个结点。
废话不多说了,直接上代码:
头文件:
#include<stdio.h>
#include<stdlib.h>
数据类型重定义:
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next; //指向后继结点
} LinkNode;
注意:数据类型重定义的意思是将一个自己命名的类型用已经有的类型来代替,同时typedef有很多用法,其中最多的用法就是为数据类型,同时也方便程序员写代码。
在c语言中,它可以用系统提供的标准类型名使用或者可以自己重新定义新的类型名。
例如:
定义1:
typedef unsigned int uint;
uint a;
定义2:
unsigned int a;
以上两种定义是同等的,相当于给unsigned int 起了个别名叫uint,当然也可以叫别的名字。
头插法:
void CreateListF(LinkNode *&L, ElemType a[], int n)
{
LinkNode * s;
L = (LinkNode *)malloc(sizeof(LinkNode)); //创建头节点
L->next = NULL;
for(int i = 0; i < n; i++){
s = (LinkNode *)malloc(sizeof(LinkNode));//创建新节点s
s->data = a[i];
s->next = L->next; //将节点s插在开始接点之前,头节点之后
L->next = s;
}
}
如图所示:
输出单链表:
void DispList(LinkNode *L){
LinkNode *p = L->next; //p指向首节点
while(p != NULL){ //p不为NULL,输出p节点的data
printf("%d ", p->data);
p = p->next; //p移向下一个节点
}
printf("\n");
}
主函数:
int main()
{
LinkNode *h;
ElemType a[10]={0,1,2,3,4,5,6,7,8,9};
CreateListF(h,a,10);
DispList(h);
return 0;
}
结果如图所示:
根据结果可以得出的结论:使用头插法插入的数据元素和数组原本的元素的顺序是相反的,这是因为数组越后面的元素在插入链表时总是在首结点处插入的。
注意 : 这个程序在建立文件时应该建立后缀名为.cpp的文件,建立.c文件在编译时可能会出错!!!