链表的两种创建方式

请先对链表有整体理解后再看。

链表的创建

#include"stdio.h"
#include"stdlib.h"
#define len sizeof(s)
typedef struct student
{
	long num;
	int score;
	struct student *next;
}s,*xs;//对该结构体重定义
xs p0,p1,p2,h,h1,h2;

ds creat()
{
	p2=p1=(ds)malloc(len);
	scanf("%d",&p1->a);
	h=NULL;
	while(p1->a)//结束创建的条件
	{
		if(h==NULL)//考虑链表为空的情况,即创建第一个结点时
			h=p1;

		else
			p2->next=p1;

			p2=p1;//p2必须紧跟p1,以便p1与前一个链接
			p1=(ds)malloc(len);
			scanf("%d",&p1->a);
	}

	p2->next=NULL;

	return(h);
}

链表的按序创建

xs creat()
{
	p2=p1=(xs)malloc(len);
	scanf("%d",&p1->a);
	h=NULL;
	while(p1->a)//结束创建的条件
	{
		if(h==NULL)//考虑链表为空的情况
		{
			h=p1;
			p1->next=NULL;
		}
		else //按顺序创建与链表的插入相类似
		{
			if(p1->a <= h->a)//若要插入的在头指针之前
	   		 {
				p1->next=h;
				h=p1;
			}
			else//要插入的在头指针之后
			{
				p2=h; 
				while(p2->next&&p2->next->a < p1->a)//找插入的位置
					p2=p2->next;
 
				p1->next=p2->next;
				p2->next=p1;
		 }
	 }
	 p1=(xs)malloc(len);
	 scanf("%d",&p1->a);
}

	return h;
}

注意运用对比法学习链表。
同时链表的插入和删除也有类似的步骤,学会找出异同加深理解。