//***明白这个需要对指针有一定的了解: 数据域用来存储结点的数据,可以新建立一个一个类型用来存储不同的数据;
指针域用来存储一个地址,指向存储这个地址的结点;
//正向建立链表;
#include<stdio.h>
#include<stdlib.h>
#define N 5 //提前定义数组元素的个数;
//定义每个结点的组成部分;
typedef struct mode
{
int data; //数据域;
struct mode *next; //指针域;
}ElemSN;
//正向建立单向链表;
ElemSN *CreatLink(int a[])
{
ElemSN *h=0,*p,*tail;
for(int i=0;i<N;i++) //通过循环的方式将数组a的元素依次添加到链表,成为链表的结点;
{
p=(ElemSN *)malloc(sizeof(ElemSN)); //建立链表的结点,并且指针p指向这个结点;
p->data=a[i]; //给这个新创建的结点的数据域赋值,p->data表示p指向新建立结点的数据域;
p->next=NULL; //给这个新创建的结点的指针域赋空,p->next表示p指向新建立结点的指针域;
if(!h) //表示链表的头结点为空,说明这时候链表上没有结点;
h=tail=p; //将这个指针p的指向赋给链表的头结点h和移动指针tail;
else //表示这个链表上有结点;
tail=tail->next=p; //将新创建的指针p的指向赋给指针tail,并且tail指针指向指针p的指向
}
return h;
}
//输出链表;
void PrintLink(ElemSN *h)
{
ElemSN *p;
for(p=h;p!=NULL;p=p->next) //每次循环都会将指针指向下一个结点;
printf("%5d",p->data); //输出这个结点的数据域;
printf("\n");
}
int main(void)
{
int a[N]={3,2,7,6,8}; //提前初始化需要建立链表的数组也可以在结果显示窗口手动输入;
ElemSN *head=NULL;
//正向建立链表;
head=CreatLink(a);
//输出;
PrintLink(head);
return 0;
}
//结果输出;
//输出的结果和数组的顺序没有什么区别,但是在计算机里的表示形式不同;
//并且链表在查找,删除,插入,都要比数组来得方便;