创建单链表的4种方式

单链表在数据结构中应用广泛,是极常见的链式存贮方式,单链表分为有带头结点和不带头结点的单链表,其创建方式又分为头插法创建和尾插法创建,详细创建方法如下:

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType; //类型定义声明
typedef struct Node
{
	ElemType data;
	struct Node *next;
}LNode, *LinkList;

int InitList_link(LinkList *h) //初始化单链表函数,初始化空单链表,带头结点
{
	*h = (LinkList)malloc(sizeof(LNode));
	if(NULL == *h)
		return -1;
	(*h)->next = NULL;
	return 0;
}

int InitList_link_nh(LinkList *h)//初始化单链表函数,初始化空单链表,不带头结点
{
	*h = NULL;
	return 0;
}

int CreateList_link_h(LinkList h, int n)//带头结点—头插法-创建链表函数
{
	
	LNode *p;
	int i;
	printf("带头结点 头插法\n");
	for(i=n;i>0;i--)
	{
		p=(LinkList)malloc(sizeof(LNode));
		 if(NULL==p)
		  return -1;
        printf("请输入第%d个元素",i);
		scanf("%d",&p->data);
		p->next=h->next;
		h->next=p;
	}
    printf("\n");
	return 0;
}

int CreateList_link_t(LinkList h, int n)//带头结点—尾插法-创建链表函数
{
    int i;
	LNode *p,*q;//定义一个q指针始终指向尾链表
	printf("带头结点 尾插法\n");
	q=h;
    for(i=1;i<=n;i++)
	{
		p=(LinkList)malloc(sizeof(LNode));
		 if(NULL==p)
		  return -1;//分配空间失败,返回-1
		printf("请输入%d个元素:",i);
		scanf("%d",&p->data);
		p->next=NULL;
        q->next=p;
		q=p;
	}
    printf("\n");
	return 0;
}

int CreateList_link_nh_h(LinkList *h, int n)//不带头结点—头插法-创建链表函数
{
	LNode *p=NULL;
	int i;
	printf("不带头结点 头插法\n");
	for(i=n;i>=1;i--)
	{
		 p=(LinkList)malloc(sizeof(LNode));
          printf("请输入%d个元素:",i);
	     scanf("%d",&p->data);
		 p->next=(*h);
		 (*h)=p;

	}
    printf("\n");
	return 0;
}

int CreateList_link_nh_t(LinkList *h, int n)//不带头结点—尾插法-创建链表函数
{
	LNode *p=NULL,*q=NULL;
	int i=1;
	printf("不带头结点 尾插法\n");
	{
       p=(LinkList)malloc(sizeof(LNode));
   	   p->next=NULL;
	   printf("请输入%d个元素:",i);
	   scanf("%d",&p->data);
	   (*h)=p;	   
	}
     q=(*h);
	 for(i=2;i<=n;i++)
	  {
	    
	     p=(LinkList)malloc(sizeof(LNode));
   	     p->next=NULL;
	     printf("请输入%d个元素:",i);
	     scanf("%d",&p->data);
	     q->next=p;
		 q=p;
	  }
	
    printf("\n");
	return 0;
}

void ShowList_link(LinkList h, int flag)//输出当前链表函数
{
	Node *p = NULL;
	if(1 == flag)
		p = h->next;
	else
		p = h;
	while(NULL != p)
	{
		printf("%d  ", p->data);
		p = p->next;
	}
	printf("\n");
}



void main()
{
	LinkList h1, h2, h1_nh, h2_nh;
	int len;

	InitList_link(&h1);
	InitList_link(&h2);
	InitList_link_nh(&h1_nh);
	InitList_link_nh(&h2_nh);

	printf("please input the length of list:\n");
	scanf("%d", &len);

	while(len <= 0)
	{
		printf("please input the length of list:\n");
		scanf("%d", &len);
	}



	CreateList_link_h(h1, len);
	CreateList_link_t(h2, len);
	CreateList_link_nh_h(&h1_nh, len);
	CreateList_link_nh_t(&h2_nh, len);
	printf("h1 is:");
	ShowList_link(h1, 1);
	printf("\n");
	printf("h2 is:");
	ShowList_link(h2, 1);
	printf("\n");
	printf("h1_nh is:");
	ShowList_link(h1_nh,0);
	printf("\n");
	printf("h2_nh is:");
	ShowList_link(h2_nh,0);
	printf("\n");
}






程序运行截图:




  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值