c语言数据结构(大题)
编程=头发+代码
这个作者很懒,什么都没留下…
展开
-
设计判断二叉树是否为二叉排序树的算法
bool isValidBST(TreeNode* root) { if (!root) return true; TreeNode *left = root->left; TreeNode *right = root->right; while (left) { if (root->val <= left->val) return false; left = left->right;原创 2021-04-07 21:04:34 · 1070 阅读 · 0 评论 -
假设一个图G采用邻接表作为存储结构,设计一个算法,判断该图中是否存在回路
解:采用深度优先遍历方法,从顶点v出发,对每个访问的顶点w做标记(visited[w]=1)。若顶点w(先访问)和i(后访问)均已访问过,表示从顶点w到顶点i存在一条路径。当从顶点i出发遍历,发现顶点i到顶点w有一条边时,表示存在一个回路(该回路上包含顶点w和i)。算法Cycle(G,v,has)从顶点v出发判断图G中是否存在回路,has是布尔值,初始调用时置为false,执行后若为true表示有回路,否则表示图G中没有回路。对应的算法如下:void Cycle(AGraph *G,int v,bool原创 2021-04-02 16:37:16 · 4388 阅读 · 1 评论 -
数据结构大题
1. 假设二叉树采用二叉链存储结构进行存储,假设每个节点值为单个字符且所有节点值不同,设计一个算法,输出二叉树b中第k的所有节点值,并分析你所设计算法的时间复杂度。void Dispk(BTNode *b,int k){ Dispk1(b,k,1);}void Dispk1(BTNode *b,int k,int h){ if (b!=NULL) { if (h==k) printf(“%c “,b->data); Dispk1(b->lchild,k,h+1); D原创 2021-03-31 17:23:15 · 1386 阅读 · 0 评论 -
十进制和八进制的相互转换
十进制转八进制#include<stdio.h>void main(){ int n; int i = 0; printf ("n = "); scanf ("%d", &n); int a[10] = {0}; while (n){ a[i++] = n % 8; n = n / 8; } int j; for (j = i-1; j >= 0; j--) {原创 2021-03-31 16:05:24 · 867 阅读 · 0 评论 -
数据结构应用题
有两个磁盘文件“A”和“B”,各存放一行字母,今要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件"C"中去。#include <stdio.h>#include <stdlib.h>int main (){ FILE *fp; int i,j,n,i1; char c[100],t,ch; if ((fp=fopen("a1","r"))==NULL) { printf("\ncan not open file\n"); exit(0)原创 2021-03-30 20:16:21 · 684 阅读 · 0 评论 -
假设一个连通图采用邻接表G存储结构表示。设计一个算法,求起点u到终点v的经过顶点k的所有路径
int visited[MAXV]={0}; //全局变量void PathAll(ALGraph *G,int u,int v,int k,int path[],int d)//d是到当前为止已走过的路径长度,调用时初值为-1{ int m,i; ArcNode *p; visited[u]=1; d++; //路径长度增1 path[d]=u; //将当前顶点添加到路径中 if (u==v && In(path,d,k)==l) //输出一条路径原创 2021-03-29 21:30:05 · 2515 阅读 · 2 评论 -
求指定值为x的结点的双亲结点p
假设二叉树b采用二叉链存储结构,设计一个算法void findparent(BTNode *b,ElemType x,BTNode *&p)求指定值为x的结点的双亲结点p,提示,根结点的双亲为NULL,若在b中未找到值为x的结点,p亦为NULL。void findparent(BTNode *b,ElemType x,BTNode *&p){BTNode *k; k=d;if(k->data ==x) p=null;if(k->lchild->data == x原创 2021-03-29 21:17:45 · 3007 阅读 · 4 评论 -
设计一个尽可能高效的算法求A和B的交集,要求不破坏A、B的结点,将交集存放在单链表C中
设A和B是两个结点个数分别为m和n的单链表(带头结点),其中元素递增有序LinkList *insertion(LinkList *A,LinkList *B,LinkList *C){C=(LinkList *)malloc(sizeof(LinkList));LinkList *p,*q,*k; p=A->next; q=B->next; k=C->next;if(p==null) return null;if(q==null) return null;while原创 2021-03-29 20:54:21 · 748 阅读 · 0 评论 -
众数问题:在一个由整数组成的线性表中,出现数数最多的数称为众数
int find_zhong(List *L,int n){List *p; int i,j,time,k,num;p=L;for(i=0;i<n;i++){ k=0; for(j=0;j<n;j++){ if(p->data[i] == p->data[j]) k++; } if(time < k){ num=p->data[i]; time=k; }}return num;}原创 2021-03-29 20:43:40 · 258 阅读 · 0 评论 -
将二叉树bt中每一个结点的左右子树互换
其中ADDQ(Q,bt),DELQ(Q),EMPTY(Q)分别为进队typedef struct node{int data ; struct node *lchild, *rchild; }btnode; void EXCHANGE(btnode *bt){ btnode *p, *q; if (bt){ ADDQ(Q,bt); while(!EMPTY(Q)){ p=DELQ(Q); q= p->lchild; .原创 2021-03-29 20:08:14 · 989 阅读 · 2 评论 -
求二叉树双支个数的算法
struct TreeNode{ int data; struct TreeNode *left, *right; };int fnGetLeaf( TreeNode *T ){ if(T==NULL) return 0; if( T->left!=NULL && T->right!=NULL) return (1+fnGetLeaf(T->left)+ fnGetLeaf(T->left)); else retu原创 2021-03-29 20:05:28 · 237 阅读 · 0 评论 -
已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一算法,删除表L中所有值大于mink且小于maxk的所有元素
typedef struct LNode{ ElemType data;struct LNode *next;}LNode, LinkList;Status Delete_Between(Linklist &L,int mink,int maxk){ Linklist *p,*q; p=&L; p=&L; if(p==null) exit(1); while(p!=null && p->data > mink){ q=p;原创 2021-03-29 19:45:33 · 4041 阅读 · 0 评论 -
设计判断单链表中结点是否关于中心对称算法
对于判断单链表是否关于中心对称,要借助栈来实现。先将前半段的单链表数据放入栈中,然后把后半段的数据与栈的数据一个一个比较bool judegement(LinkList *L,int n){if(L==null) return false;int i; LinkList *p; p=L->next;stack<char> s;for(i=0;i<n/2;i++){ s.push(p->data); p=p->next;}if(n%2==1.原创 2021-03-28 18:14:14 · 1856 阅读 · 0 评论 -
试编写一个N个不相同整数的升序列,对于任一给定的整数,求与上述数列中数值最接近的整数的下标索引算法
typedef struct{int data[100];int last;//最后元素的下标} SeqList;int seek_like(SeqList &List,int num){ int i=0,j; while(num > List->data[i] && i<=List->last) i++; if(i==List->last) return i; if(List->data[i]-num < num – L.原创 2021-03-28 17:58:31 · 207 阅读 · 1 评论 -
试编写一个函数,要在一棵树Tree中,找出最大值
假设二叉树采用左右孩子指针存储结构,即其结点数据类型描述为:struct TreeNode{int data;//数据域struct TreeNode *left, *right;//指向其左右孩子结点};试编写一个函数,要在一棵树Tree中,找出最大值。函数原型如下:bool fnGetMax( struct TreeNode *Tree, int *max );//找到最大值则返回true,否则返回false;bool fnGetMax(struct TreeNode *Tree, .原创 2021-03-28 17:18:44 · 256 阅读 · 0 评论 -
删除顺序表前i个元素
#define MaxSize 100typedef struct{int data[MaxSize];int last; //最后元素的下标} SeqList;使用如下函数原型:bool fnDelete( SeqList *L, int i );//成功删除则返回true,否则返回falsebool fnDelete(SeqList *L , int i){if(i<0 || i>L->last+1) return false;int j;for(j=i;j.原创 2021-03-28 17:09:44 · 552 阅读 · 0 评论 -
编写算法函数,把顺序表List原地置逆
编写算法函数,把顺序表List原地置逆顺序表的数据结构如下:typedef struct{int data[100];int last;//最后元素的下标} SeqList;函数原形为:void fnReverse( SeqList &List );void fnReverse(SeqList &List){int i,s,temp;SeqList *p; p=&List;s=p->last;if(p->data[0]==null) exit(原创 2021-03-28 16:45:26 · 450 阅读 · 0 评论 -
设有一线性表(a1, a2,…,an-1)用单链表存储,写算法实现将其就地逆置的操作。(“就地”是指辅助空间应为O(1))
设有一线性表(a1, a2,…,an-1)用单链表存储,写算法实现将其就地逆置的操作。(“就地”是指辅助空间应为O(1))将头指针赋给指针变量 q=L;将头指针下一个变量赋给另一个指针变量 p=L->next;开始单链表头插法过程 p->next=q->next; q->next=p; p=k->next;void Reverser(LinkList *L){LinkList *p,*q;p=L->next; q=L; L->next=null原创 2021-03-28 16:37:35 · 2252 阅读 · 0 评论 -
设计两个有序单链表的合并排序算法
设计两个有序单链表的合并排序算法LinkList MergeList(LinkList *La,LinkList *Lb){LinkList *p,*q,*k;P=La->next; q=Lb->next; k=La;if(La==null) return Lb;if(Lb==null) return La;While(p!=null && q!=null){if(p->data <= q->data){k->next = p;k=原创 2021-03-28 16:10:01 · 1510 阅读 · 0 评论