数据结构-函数题

6-1 求采用邻接矩阵作为存储结构的无向图各顶点的度 

本题要求实现一个函数,输出无向图每个顶点的数据元素的值,以及每个顶点度的值。

void degree(MGraph G)
{
	int i,j;
	for(i=0;i<G.vexnum;i++)
	{
		int du=0;
		for(j=0;j<G.vexnum;j++)
		{
			if(G.arcs[i][j]==1)//如果G.arcs[i][j]!=0,du++; 
			{
				du++;
			}
		}
		printf("%c:%d\n",G.vexs[i],du);
	} 
}

 6-2 顺序表的查找操作

本题要求实现一个函数,要求从顺序表中查找指定元素,并返回第一个查找成功的元素在表中的位置序号,若查找失败,则返回0;

int LocateElem(SqList L,ElemType e)
{
	int i;
	for(i=0;i<L.length;i++)
	{
		if(L.elem[i]==e)//L.elem[i] 
		{
			return i+1;
		}
	} 
	return 0;
}

 6-3 二叉树叶结点计数

实现一个函数,返回二叉树bt中叶结点的数量。

题目保证二叉树中所有元素均为整数。

/*统计二叉树中叶子结点的数目并没,有次序要求,
可以用三种遍历中的任意一种来完成.
一、后序遍历统计 
叶子结点:既没有左孩子,又没有右孩子 
*/ 
int countLeaves(struct BinTree *bt)
{
	int cnt=0;
	if(bt!=NULL)
	{
		countLeaves(bt->leftt);
		countLeaves(bt->right);
		if(bt->left==NULL&&bt->right==NULL)
		{
			cnt++;
		}
	} 
	return cnt;
}
/*
方法二:采用分治方法,如果二叉树为空树,返回0,
如果二叉树只有一个结点 ,返回1
否则为左右子树叶子结点的和 
*/
int countLeaves(struct BinTree *bt)
{
    int count=0;
    if(bt==NULL)
        return 0;
    else if(bt->left==NULL && bt->right==NULL)
        return count+1;
    else
    {
        count=countLeaves(bt->left)+countLeaves(bt->right);
        return count;
    }
}


 

 6-4 按值查找单链表

本题要求实现一个函数,Locate_LinkList(LinkList L, datatype x)函数是在带头结点单链表中查找值为x的结点。函数须返回找到结点的指针,没有找到返回空。

其中 L 和 x 都是用户传入的参数。 L 是单链表的头指针; x 是需要查找的值。函数须返回找到结点的指针,没有找到返回空。

LNode *Locate_LinkList(LinkList L, datatype x)
{
	LNode *p;
	p=L->next;
	while(p!=NULL&&p->data!=x)//当它不为空并这个数据值不等于x 
	{
		p=p->next;//则找下一个 
	}
	return p;//返回找到该节点的指针 
}

6-5二叉树层序遍历

void LevelorderTraversal( BinTree BT )
{
    BinTree A[100];
    BinTree p;
    int rear=0,front=0;
    if(BT==NULL)
       return ;
    else
    {
    	A[rear++]=BT;
    	while(rear!=front)
    	{
    		p=A[front++];
    		printf(" %c",p->Data);
    		if(p->Left)
    		    A[rear++]=p->Left;
    		if(p->Right)
    		    A[rear++]=p->Right;
		}
	}
}

6-6 单链表逆转

List Reverse( List L )
{
    List pre,temp;
    pre=NULL;
    while(L)
    {
        temp=L->Next;
        L->Next=pre;
        pre=L;
        L=temp;
    }
    return pre;
}

 6-7 求链式表的表长

int Length( List L )
{
    int len=0;
    while(L)
    {
        L=L->Next;
        len++;
    }
    return len;
}

 6-8 链式表的按序号查找

ElementType FindKth( List L, int K )
{
    if(L==NULL||K<=0)
        return ERROR;
    else
    {
        for(int i=1;i<K;i++)
        {
            if(L->Next==NULL)
                return ERROR;
            L=L->Next;
        }
        return L->Data;
    }
}

 6-9 求二叉树高度

int GetHeight( BinTree BT )
{
    int hl=0,hr=0,h;
    if(BT)
    {
        hl=GetHeight(BT->Left);
        hr=GetHeight(BT->Right);
        h=hl>hr?hl:hr;
        return h+1;
    }
    else
        return 0;
}

 6-10先序输出叶结点

void PreorderPrintLeaves( BinTree BT )
{
    if(BT)
    {
        PreorderPrintLeaves(BT->Left);
        PreorderPrintLeaves(BT->Right);
        if(BT->Left==NULL&&BT->Right==NULL)
        {
            printf(" %c",BT->Data);
        }
    }
}

6-11 二分查找

Position BinarySearch( List L, ElementType X )
{
    int l=0,r=L->Last;
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(L->Data[mid]==X)
        {
            return mid;
        }
        else if(L->Data[mid]<X)
        {
            l=mid+1;
        }
        else{
            r=mid-1;
        }
    }
    return NotFound;
}

 6-12 二叉树的遍历

void InorderTraversal( BinTree BT )
{
    if(BT)
    {
        InorderTraversal(BT->Left);
        printf(" %c",BT->Data);
        InorderTraversal(BT->Right);  
    }
}
void PreorderTraversal( BinTree BT )
{
    if(BT)
    {
        printf(" %c",BT->Data);
        PreorderTraversal(BT->Left);
       PreorderTraversal(BT->Right);  
    }
}
void PostorderTraversal( BinTree BT )
{
    if(BT)
    {
         PostorderTraversal(BT->Left);
        PostorderTraversal(BT->Right); 
        printf(" %c",BT->Data);
    }
}
void LevelorderTraversal( BinTree BT )
{
    BinTree A[1100];
    BinTree p;
    int rear=0,front=0;
    if(BT)
    {
        A[rear++]=BT;
        while(rear!=front)
        {
            p=A[front++];
            printf(" %c",p->Data);
            if(p->Left)
                A[rear++]=p->Left;
            if(p->Right)
                A[rear++]=p->Right;
        }
    }
    else
        return ;
}

6-13 链式表操作集

Position Find( List L, ElementType X )
{
	while(L)
	{
		if(L->Data==X)
		    return L;
		L=L->Next;
	}
	return ERROR;
}
/*将 x插入在位置p指向的结点之前,返回链表的表头。
如果参数P指向非法位置,则打印并返回*/ 
List Insert( List L, ElementType X, Position P )
{
	if(P==L)
	{
		List Node=(List)malloc(sizeof(List));
		Node->Data=X;
		Node->Next=L;
		return Node;
	}
	List q=L;
	while(q)
	{
		if(q->Next==P)
		{
			List Node=(List)malloc(sizeof(List));
			Node->Data=X;
			Node->Next=q->Next;
			q->Next=Node;
			return L;
		}
		q=q->Next;
	}
	printf("Wrong Position for Insertion\n");
	return ERROR;
}
List Delete( List L, Position P )
{
	if(L==P)
	   return L->Next;
	List q=L;
	while(q)
	{
		if(q->Next==P)
		{
			q->Next=q->Next->Next;
			return L;
		}
		q=q->Next;
	}
	printf("Wrong Position for Deletion\n");
	return ERROR;
}

 6-14 顺序表操作集

List MakeEmpty()
{
	List L=(List)malloc(sizeof(struct LNode));
	L->Last=-1;
	return L;
}
Position Find( List L, ElementType X )
{
	for(int i=0;i<=L->Last;i++)
	{
		if(L->Data[i]==X)
		{
			return i;
		}
	}
	return ERROR;
}
bool Insert( List L, ElementType X, Position P )
{
	if(L->Last>=MAXSIZE-1)
	{
		printf("FULL");
		return false;
	}
	if(P>L->Last+1||P<0)
	{
		printf("ILLEGAL POSITION");
		return false;
	}
	for(int i=L->Last;i>=P;i--)//dengyu
	{
		L->Data[i+1]=L->Data[i]; 
	}
	L->Data[P]=X;
	L->Last++;
	return true;
}
bool Delete( List L, Position P )
{
	if(P>L->Last||P<0)
	{
		printf("POSITION %d EMPTY",P);
		return false;
	}
	for(int i=P;i<L->Last;i++)//xiaoyu
	{
		L->Data[i]=L->Data[i+1];
	}
	L->Last--;
	return true;
}

 6-15 直接插入排序

void InsertSort(SqList L)
{
	int i,j;
	int temp;
	for(i=1;i<=L.Length;i++)
	{
		for(j=i+1;j<=L.Length;j++)
		{
			if(L.elem[i]>elem[j])
			{
				temp=L.elem[j];
				L.elem[j]=L.elem[i];
				L.elem[i]=temp;
			}
		}
	}
}

  • 25
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值