数据结构:树的孩子链表存储

/*********************************************************

程序:树的孩子链表存储
完成者:小单
完成时间:2013年5月21日
**********************************************************/

//测试
图片
#include <stdio.h>
#include <stdlib.h>
#define MAX_TREE_SIZE 20
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
typedef int TElemType;
typedef int Status;
#define OK 1

//--------------树的孩子链表存储表示----------------------
typedef struct CTNode
{
	//孩子结点
	int child;
	struct CTNode *next;
}*ChildPtr;

typedef struct  
{
	TElemType data;//结点值
	ChildPtr firstchild; //孩子链表头指针
	           //增设一个双亲的域,能方便地找到其双亲。int Parent;
}CTBox;

typedef struct 
{
	CTBox nodes[MAX_TREE_SIZE];  //
	int n, r;  //结点数和根的位置 
}CTree;

Status CreateTree(CTree &T)
{
	//构建一棵树
	printf("请输入结点数及根结点的位置下标:\n");
	scanf("%d %d",&T.n, &T.r);
	printf("请输入各节点的值\n");
	for(int i = 0; i < T.n; ++i)
	{
		scanf("%d",&T.nodes[i].data);
		T.nodes[i].firstchild = NULL;
	}
	printf("创建每个结点的孩子结点...\n");
	system("pause");
	for(i = 0; i < T.n; ++i)
	{
		printf("请输入位置为%d的结点的孩子个数(>=0),有孩子则输入孩子们的位置:\n",i);
		int nChild=0;
		scanf("%d",&nChild);
		ChildPtr p=NULL;  //p指向插入孩子位置的前一个位置
		ChildPtr q=NULL;  //q用于提示即将插入的新b孩子链表结点
		for(int j = 0; j < nChild; ++j)
		{
			q= (ChildPtr)malloc(sizeof(struct CTNode));//为孩子的位置开辟一个空间	
			if(!q)
				exit(OVERFLOW);
			scanf("%d",&(q->child));  //将孩子链表结点置入位置值
			q->next = NULL;
			if(j == 0)//将孩子链表头结点指向孩子链表第一个结点
			{
				T.nodes[i].firstchild = q;
			}
			else
			{
				p->next = q;
			}
			p = q;	
		}
	}
	return OK;
}



Status PrintChild(const ChildPtr &C)
{//打印出结点的孩子
	if(C)
	{
		ChildPtr p;
		p = C;
		while(p)
		{
			printf("%d ->",p->child);
			p = p->next;
		}
		printf("NULL");
		return TRUE;
	}
	else
	{
		printf("NULL");
		return FALSE;
	}
	
}
void PrintChildTree(const CTree &T)//输出树的结点及他们的孩子
{
	printf("\n位置%d为树的根%d\n\n", T.r, T.nodes[T.r].data);
	for(int i = 0; i < T.n; ++i)
	{
		printf("位置%d,结点值%d ->", i, T.nodes[i].data);
		PrintChild(T.nodes[i].firstchild);
		printf("\n");
		
	}
}

Status FindChildOfNode(const CTree &T, TElemType e)//找结点e的孩子
{
	for(int i = 0; i < T.n; i++)
	{
		if(T.nodes[i].data == e)
		{
			printf("结点%d ->",e);
			PrintChild(T.nodes[i].firstchild);
			printf("\n");
			return TRUE;
		}
	}
	printf("无此结点\n");
	return FALSE;
}


int main()  //测试
{
	CTree T;
	CreateTree(T);
	PrintChildTree(T);
	while(1)
	{
		int data;
		printf("请输入你要查找其孩子的结点\n");
		scanf("%d",&data);
		FindChildOfNode(T,data);
		system("pause");
	}
	return 0;
}


  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pintos是一个操作系统的教学项目,它里面有许多基础的数据结构。其中之一就是通用链表(generic list)。 链表是一个常见的数据结构,用于存储一系列的元素。在Pintos中,通用链表是一种灵活且可扩展的数据结构,可以存储任意类型的元素。 Pintos中的通用链表由两个主要的结构组成:链表节点和链表本身。每个链表节点包含了一个指向前一个节点的指针和一个指向后一个节点的指针,以及一个用于存储元素的指针。链表本身则包含了一个指向头节点和尾节点的指针,以及用于记录链表长度的变量。 通过使用这些结构,Pintos的通用链表提供了一系列的操作来管理链表中的元素。比如,它可以实现在链表头部和尾部插入元素、删除元素以及在指定位置插入或删除元素等功能。此外,通过遍历链表,我们可以对链表中的每个元素进行操作,比如查找、更新和打印。 Pintos的通用链表使用简单而高效的方法来处理链表操作。通过使用指针连接节点,我们可以轻松地插入和删除元素,并且时间复杂度为O(1)。而遍历链表的操作也只需要O(n)的时间复杂度,其中n是链表的长度。 总之,Pintos的通用链表为操作系统的开发提供了一个方便和高效的数据结构。它可以存储任意类型的元素,并提供了丰富的操作来管理和操作这些元素。无论是在Pintos项目中还是在实际操作系统的开发中,通用链表都是一个非常有用的工具。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值