1、尾插法
生成结点->尾插->尾指针后移,注意头指针的生成和后续挂链需要分开写
#include <stdio.h>
#include <stdlib.h>
#define N 6
typedef struct node{
int data;
struct node *next;
}SN;
SN *CreateNode(int a[],int num);
int main()
{
SN *head;
int b[N]={1,2,3,4,5,6};
head=CreateNode(b,N);
return 0;
}
SN *CreateNode(int a[],int num)
{
SN *tail,*h=NULL,*p; //头指针初始化必须为NULL
int i;
for(i=0;i<N;i++)
{
p=(SN *)malloc(sizeof(SN)); //生成结点
p->data=a[i];
p->next=NULL;
if(!h)h=tail=p; //生成头指针
else tail=tail->next=p; //挂链,尾指针后移
}
for(p=h;p;p=p->next)
printf("%d",p->data);
return h;
}
2、前插法
生成结点->挂链->头指针前移,此时不需要区分头部和中间
#include <stdio.h>
#include <stdlib.h>
#define N 6
typedef struct node{
int data;
struct node *next;
}SN;
SN *CreateNode(int a[],int num);
int main()
{
int b[6]={1,2,3,4,5,6};
SN *head;
head=CreateNode(b,N);
return 0;
}
SN *CreateNode(int a[],int num)
{
int i;
SN *p,*h=NULL; //头指针初始化为NULL,保证链表尾部NULL
for(i=N-1;i>=0;i--)
{
p=(SN *)malloc(sizeof(SN)); //生成结点
p->data=a[i];
p->next=h; //前插
h=p; //头指针前移
}
for(p=h;p;p=p->next)
printf("%d",p->data);
return h;
}
两法区别:前插法不需要区分头部和中间结点创立,尾插需要,创建链表时结合实际情况。