单链表的头插法与尾插法详解及实现(C语言)

单链表的建立有头插法和尾插法

首先是定义一个结构体

#include 
#include  
#include 
#define ElemType int 

typedef struct LNode{
	ElemType Data;            //数据域
	struct LNode *Next;      //指针域
}LNode,*LinkList

其次是主函数,用来输入和输出我们的链表;
我们通常用头指针来标识一个单链表,如单链表L。

void PrintList(LinkList L)
{
    LinkList p;
    p=L->Next
    printf("链表元素如下:\n");
    while(p!=NULL)
    {
        printf("%d ",p->Data);
        p=p->Next;
    }
    printf("\n");
}
int main()
{
	LinkList L;//结构变量L即表示整个链表,也是头指针指向头结点
	printf("尾插法建立单链表,输入值(9999结束)\n")
    L=CreateList_Head(L);
    PrintList(L);
    printf("头法建立单链表,输入值(9999结束)\n")
    L=CreateList_Tail(L);
    PrintList(L);
	return 0;
}

头插法建立单链表

头插法会使输入的数据插入到链表的表头,输出数据时的数据与读入的数据时相反的,如,以1 2 3 4 5 6 7 8 9建立链表,输出的结果是9 8 7 6 5 4 3 2 1 。第一个元素会始终在链表的尾部
1.建立一个空表,此时头指针L指向头结点,L->Next=NULL,如图
单链表的头插法与尾插法详解及实现(C语言)_第1张图片
2.while的第一次循环,插入第一个结点,进行如下操作
单链表的头插法与尾插法详解及实现(C语言)_第2张图片

	s->Data=x;         数据域插入值        
	          
	s->Next=L->Next;          
	L->Next=s;            
	第一个结点的指针域,等于头指针的指针域等于NULL,
	表示链尾。然后将节点插入到链表中,这两步的顺序一定不能相反。

3.while的n次循环,如图
单链表的头插法与尾插法详解及实现(C语言)_第3张图片

头插法代码如下

LinkList CreateList_Head(LinkList L)
{
	LinkList s;int x;
	L = (LNode*)malloc(sizeof(LNode));     //创建头结点 
	L->Next=NULL;                          
	scanf("%d",&x);                       
	while(x!=9999){                             
		s=(LNode*)malloc(sizeof(LNode));  
		s->Data=x;                           
		s->Next=L->Next;                      
		L->Next=s;                          //插入结点
		scanf("%d",&x);
	}
	return L;
}

尾插法建立单链表

尾插法使每次的数据插入到链尾,保证了输入数据的顺序与链表顺序的一致性,如 输入1 2 3 4 5 6 7 8 9,这样的数据在链表也同样以 1 2 3 4 5 6 7 8 9 保存
1.
单链表的头插法与尾插法详解及实现(C语言)_第4张图片
单链表的头插法与尾插法详解及实现(C语言)_第5张图片
单链表的头插法与尾插法详解及实现(C语言)_第6张图片
代码实现

//2.尾插法
LinkList CreateList_Tail(LinkList L)
{
	int x;
	L = (LNode*)malloc(sizeof(LNode));
	LNode *s,*r=L;
	scanf("%d",&x);
	while(x!=9999){                             
		s=(LNode*)malloc(sizeof(LNode));     //创建新的结点 
		s->Data=x;                           
		r->Next=s;                      
		r=s;
		scanf("%d",&x);
	}
	r->Next=NULL;
	return L;
 } 

跑起来

#include 
#include  
#include 
#define ElemType int 
typedef struct LNode{
	ElemType Data;
	struct LNode *Next;
}LNode,*LinkList;

//1.链表的创建 (头插法) 
LinkList CreateList_Head(LinkList L)
{
	LinkList s;int x;
	L = (LNode*)malloc(sizeof(LNode));    
	L->Next=NULL;                          
	scanf("%d",&x);                       
	while(x!=9999){                             
		s=(LNode*)malloc(sizeof(LNode));  
		s->Data=x;                           
		s->Next=L->Next;                      
		L->Next=s;
		scanf("%d",&x);
	}
	return L;
}
//2.尾插发 
LinkList CreateList_Tail(LinkList L)
{
	int x;
	L = (LNode*)malloc(sizeof(LNode));
	LNode *s,*r=L;
	scanf("%d",&x);
	while(x!=9999){                             
		s=(LNode*)malloc(sizeof(LNode));     //创建新的结点 
		s->Data=x;                           
		r->Next=s;                      
		r=s;
		scanf("%d",&x);
	}
	r->Next=NULL;
	return L;
 } 


void PrintList(LinkList L)
{
    LinkList p;
    p=L->Next; 
    printf("链表元素如下:\n");
    while(p!=NULL)
    {
        printf("%d ",p->Data);
        p=p->Next;
    }
    printf("\n");
}
int main()
{
	LinkList L;//结构变量L即表示整个链表,也是头指针指向头结点
	printf("尾插法建立单链表,输入值(9999结束)\n"); 
    L=CreateList_Head(L);
    PrintList(L);
    printf("头法建立单链表,输入值(9999结束)\n");
    L=CreateList_Tail(L);
    PrintList(L);
	return 0;
}

结果

单链表的头插法与尾插法详解及实现(C语言)_第7张图片

你可能感兴趣的:(数据结构)