C语言——数据结构——创建一条带头结点的双向链表

#include <stdio.h>//printf
#include <stdlib.h>//malloc
#include <string.h>//strlen


typedef int Elemtype;		//数据元素的类型

typedef struct binode
{
	Elemtype data;			//数据域:用来保存数据本身
	struct binode *next;	//指针域:用来保存下一个节点的地址
	struct binode *prev;	//指针域:用来保存上一个节点的地址
	int freq;				//访问频度域
}Binode;

typedef struct bihead
{
	Binode *first;			//保存的是首节点的地址
	Binode *last;			//保存的是尾结点的地址
	int num;				//保存的是链表中数据节点的个数
}Bihead;

/*
	Create_DouLinklistHead:创建一条带头结点的双向链表
		@return : 返回创建好的双向链表的头结点
*/
Bihead *Create_DouLinklistHead(void)
{
	//1.创建一个头结点并初始化
	Bihead *bihead = malloc(sizeof(Bihead));
	bihead->first = bihead->last = NULL;
	bihead->num = 0;

	Elemtype d;
	printf("请输入数据:\n");
	while(1)
	{
		//2.从终端上获取用户输入
		scanf("%d",&d);
		if(d == 0)
		{
			break;
		}

		//3.创建一个数据节点保存刚获取到的数据
		Binode *pnew = malloc(sizeof(Binode));
		pnew->data = d;
		pnew->freq = 0;
		pnew->next = pnew->prev = NULL;

		//4.将数据节点添加到链表中去
		if(bihead->num == 0)
		{
			bihead->first = bihead->last = pnew;
		}
		else
		{
			pnew->prev = bihead->last;
			bihead->last->next = pnew;
			bihead->last = pnew;
		}

		bihead->num++;
	}

	return bihead;
}


/*
	Print_DouLisklistHead1:将一条带头结点的双向链表正序打印
*/
void Print_DouLisklistHead1(Bihead *bihead)
{
	printf("此链表中节点个数为%d个,顺序打印:\n",bihead->num);
	Binode *p = bihead->first;
	while(p)
	{
		printf("%d\t",p->data);
		p = p->next;
	}
	putchar('\n');

	p = bihead->first;
	while(p)
	{
		printf("%d\t",p->freq);
		p = p->next;
	}
	putchar('\n');
}

/*
	Print_DouLisklistHead2:将一条带头结点的双向链表逆序打印
*/
void Print_DouLisklistHead2(Bihead *bihead)
{
	printf("此链表中节点个数为%d个,逆序打印:\n",bihead->num);
	Binode *p = bihead->last;
	while(p)
	{
		printf("%d\t",p->data);
		p = p->prev;
	}
	putchar('\n');

	p = bihead->last;
	while(p)
	{
		printf("%d\t",p->freq);
		p = p->prev;
	}
	putchar('\n');
}
int main()
{	
	//创建一条带头结点的双向链表
	Bihead *bihead = Create_DouLinklistHead();

	Print_DouLisklistHead1(bihead);
	Print_DouLisklistHead2(bihead);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值