急急!!C语言数据结构题,求马鞍点
//第一个:
#include
#include
#include
typedef struct myNode
{
int element;
struct myNode *next;
}NODE;
int main(void)
{
int delMax(NODE *h);//删除链表中最大值
void printList(NODE *h);//打印链表
NODE *head=NULL;//链表头
NODE *p=NULL;
NODE *q=NULL;
int i=0;
if( ( head=(NODE *)malloc(sizeof(NODE)) )==NULL )
{
printf("内存不足!");
exit(-1);//退出程序
}
head->element=-1;//初始化head里面数据值为-1
p=head;
//使随即函数rand()随机出来的值每次都不一样
srand( (unsigned int)time(NULL) );
//创建一个链表
for(i=0;i<10;i++)
{
if( ( q=(NODE *)malloc(sizeof(NODE)) )==NULL )
{
printf("内存不足!");
exit(-1);//退出程序
}
q->element=rand()%100+1;//1-100的随机数
q->next=NULL;
p->next=q;
p=p->next;//p始终指向链表末尾
}
printf("原始链表:
");
printList(head);
delMax(head);
printf("删除最大值后链表:
");
printList(head);
system("pause");
return 0;
}
void printList(NODE *h)
{
NODE *p=h->next;
printf("head(%3d)->",h->element);
while( p!=NULL )
{
printf("%3d->",p->element);
p=p->next;
}
printf("NULL
");
}
int delMax(NODE *h)
{
NODE *p=h->next;
int MAX=-1;
//第一遍遍历,找到最大值
while( p!=NULL )
{
if( p->element>MAX )
{
MAX=p->element;
}
p=p->next;
}
//第二遍遍历,删除最大值
p=h->next;
NODE *pFront=h;//pFront指向p前面一个节点
while( p!=NULL )
{
if( p->element==MAX )
{
pFront->next=p->next;
h->element=MAX;
free(p);
return 0;
}
p=p->next;
pFront=pFront->next;
}
return -1;
}
//第二个
#include
#include
typedef struct myBTREE
{
int element;
struct myBTREE *leftTree;
struct myBTREE *rightTree;
}BTREE;
int main(void)
{
int count(BTREE *b);//计算leaf个数,空的树根(只有树根的树)也会看成叶子
int countLeaf(BTREE *b);//纠正count的错误,不把树根看成叶子
void createBtree(BTREE *b);//建立树
BTREE *BT=(BTREE *)malloc(sizeof(BTREE));
BT->element=-1;
BT->leftTree=NULL;
BT->rightTree=NULL;
//这次我就不判断内存不足之类的错误了,麻烦
createBtree(BT);
printf("The count of leafs in BT:%d
",countLeaf(BT));
system("pause");
return 0;
}
int count(BTREE *b)
{
if( b==NULL )
{
return 0;
}
if( b->leftTree==NULL && b->rightTree==NULL )
{
return 1;
}
return(count(b->leftTree)+count(b->rightTree));
}
int countLeaf(BTREE *b)
{
//判断是否只有树根
if( b->leftTree==NULL && b->rightTree==NULL )
{
return 0;
}
return(count(b->leftTree)+count(b->rightTree));
}
void createBtree(BTREE *b)
{//自己在这里建立树,树根为b,这里我只让树根的左树有值
BTREE *p;
p=(BTREE *)malloc(sizeof(BTREE));
p->element=-1;
p->leftTree=NULL;
p->rightTree=NULL;
b->leftTree=p;
}
道题是说排序,原始序列为s,最终排好序的序列为s',是说si和si'(0<=i<n)相距不远,要找到一种效率比较高的排序算法。
a.堆排序。第k次整理堆时要把第k大的元素移到堆顶,比较和移动次数是O(log(n-k)),然后再交换到最终位置。算法平均代价是O(nlogn),没有用到si和si'相距不远的信息,所以不理想
b.直接插入排序。比较和移动的次数是s相对于s'的逆序数,是比较好的方法
c.快速排序。根据相距不远的特点,每次把轴值尽量选在中间,移动次数至多是s相对于s'的逆序数,比插入排序少,但是比较次数是O(nlogn),比插入排序多。所以也是很好的方法。
这题选d
int main()
{
int n, m, i, j, k, l, minn, maxx, flag ;
int a[256][256];
while(1)
{
printf("请输入矩阵的行列数:\n");
scanf("%d %d",&n,&m);
printf("请输入与行列数相符的矩阵:\n");
for( i =0 ;i < n ;i++)
for( j =0 ;j < m; j++)
scanf("%d",&a[i][j]);
flag = 0;
printf("马鞍点输出(输出该点所在的行数与列数):\n");
for( i = 0; i < n ;i++)
{
for( j = 0; j < m; j++)
{
minn = a[i][j];
for( k = 0 ;k < m; k++)
{
if( minn > a[i][k])
break;
}
if( k == m)
{
maxx = a[i][j];
for( l = 0; l < n; l++)
{
if( maxx < a[l][j])
break;
}
if( l == n)
{
printf("%d %d %d\n",i , j ,a[i][j]);
flag = 1;
}
}
}
}
if( flag == 0)
printf("此矩阵没有马鞍点");
printf("\n");
}
return 0;
}
时间匆忙,这个算法不太好,但应该可以得到正确的答案
数据没有初始化,楼主请自己输入数据吧!
还有问题欢迎和我交流啊,
#include<stdio.h>
#define M 10
#define N 10
void main()
{ int a[M][N],i,j;
int maan(int a[M][N],int i,int j);
for(i=0;i<M;i++)
for(j=0;j<N;j++)
if(maan(a[M][N],i,j))
printf("a[%d][%d]",i,j);
}
int maan(int a[M][N],int i,int j)
{int x,y;
for(x=i,y=0;y<N;y++)
if(a[i][j]>a[x][y]) return 0;
for(x=0,y=j;x<M;x++)
if(a[i][j]<a[x][y]) return 0;
return 1;
}
急急!!C语言数据结构题,求马鞍点
if( flag == 0)printf("此矩阵没有马鞍点");printf("\\n");} return 0;}
数据结构用C语言描述,求马鞍点,我这个问题在哪啊?不能给出正确的马鞍 ...
\/\/ row[1]记录了第行列的最小值,这个值应该和row[i]所在的列的最大值进行比较,\/\/ 楼主下面的代码貌似没有实现。row[i]也没有记录列号 for(i=0;i<M;i++)for(j=1;j<N;j++)if(row[i]==col[j])printf("i=%d,j=%d,%d",i,j,a[i][j]);\/\/ 找最大最小值的循环控制变量全...