C语言一道数据结构题目求解
特别说明:
把c1.h,C2-1.H,Bo2-1.cpp,Func2-2.cpp,
Main2-1.cpp 它们分别单独存为文件,然后把他们放在一个文件夹中,最后双击Main2-1.cpp。
// c1.h (文件名)
#include // 字符串函数头文件
#include // 字符函数头文件
#include // malloc()等
#include // INT_MAX等
#include // 标准输入输出头文件,包括EOF(=^Z或F6),NULL等
#include // atoi(),exit()
#include // eof()
#include // 数学函数头文件,包括floor(),ceil(),abs()等
#include // ftime()
#include // 提供宏va_start,va_arg和va_end,用于存取变长参数表
// 函数结果状态代码。
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
// #define INFEASIBLE -1 没使用
// #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE,
// c2-1.h 线性表的动态分配顺序存储结构。
#define LIST_INIT_SIZE 10 // 线性表存储空间的初始分配量
#define LIST_INCREMENT 2 // 线性表存储空间的分配增量
struct SqList
{ ElemType *elem; // 存储空间基址
int length; // 当前长度
int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)
};
// bo2-1.cpp 顺序存储的线性表(存储结构由c2-1.h定义)的基本操作(12个),包括算法2.3~2.6
void InitList(SqList &L) // 算法2.3
{ // 操作结果:构造一个空的顺序线性表L
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem) // 存储分配失败
exit(OVERFLOW);
L.length=0; // 空表长度为0
L.listsize=LIST_INIT_SIZE; // 初始存储容量
}
void DestroyList(SqList &L)
{ // 初始条件:顺序线性表L已存在。操作结果:销毁顺序线性表L
free(L.elem); // 释放L.elem所指的存储空间
L.elem=NULL; // L.elem不再指向任何存储单元
L.length=0;
L.listsize=0;
}
void ClearList(SqList &L)
{ // 初始条件:顺序线性表L已存在。操作结果:将L重置为空表
L.length=0;
}
Status ListEmpty(SqList L)
{ // 初始条件:顺序线性表L已存在。
// 操作结果:若L为空表,则返回TRUE;否则返回FALSE
if(L.length==0)
return TRUE;
else
return FALSE;
}
int ListLength(SqList L)
{ // 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素的个数
return L.length;
}
Status GetElem(SqList L,int i,ElemType &e)
{ // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)
// 操作结果:用e返回L中第i个数据元素的值
if(iL.length) // i不在表L的范围之内
return ERROR;
e=*(L.elem+i-1); // 将表L的第i个元素的值赋给e
return OK;
}
int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
{ // 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
// 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
// 若这样的数据元素不存在,则返回值为0。算法2.6
int i=1; // i的初值为第1个元素的位序
ElemType *p=L.elem; // p的初值为第1个元素的存储位置
while(i<=L.length&&!compare(*p++,e)) // i未超出表的范围且未找到满足关系的数据元素
++i; // 继续向后找
if(i<=L.length) // 找到满足关系的数据元素
return i; // 返回其位序
else // 未找到满足关系的数据元素
return 0;
}
Status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e)
{ // 初始条件:顺序线性表L已存在
// 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱;
// 否则操作失败,pre_e无定义
int i=2; // 从第2个元素开始
ElemType *p=L.elem+1; // p指向第2个元素
while(i<=L.length&&*p!=cur_e) // i未超出表的范围且未找到值为cur_e的元素
{ p++; // p指向下一个元素
i++; // 计数加1
}
if(i>L.length) // 到表结束处还未找到值为cur_e的元素
return ERROR; // 操作失败
else // 找到值为cur_e的元素,并由p指向其
{ pre_e=*--p; // p指向前一个元素(cur_e的前驱),将所指元素的值赋给pre_e
return OK; // 操作成功
}
}
Status NextElem(SqList L,ElemType cur_e,ElemType &next_e)
{ // 初始条件:顺序线性表L已存在
// 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,
// 否则操作失败,next_e无定义
int i=1; // 从第1个元素开始
ElemType *p=L.elem; // p指向第1个元素
while(i<L.length&&*p!=cur_e) // i未到表尾且未找到值为cur_e的元素
{ p++; // p指向下一个元素
i++; // 计数加1
}
if(i==L.length) // 到表尾的前一个元素还未找到值为cur_e的元素
return ERROR; // 操作失败
else // 找到值为cur_e的元素,并由p指向其
{ next_e=*++p; // p指向下一个元素(cur_e的后继),将所指元素的值赋给next _e
return OK; // 操作成功
}
}
Status ListInsert(SqList &L,int i,ElemType e) // 算法2.4
{ // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1
// 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
ElemType *newbase,*q,*p;
if(iL.length+1) // i值不合法
return ERROR;
if(L.length==L.listsize) // 当前存储空间已满,增加分配,修改
{ newbase=(ElemType*)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(ElemType));
if(!newbase) // 存储分配失败
exit(OVERFLOW);
L.elem=newbase; // 新基址赋给L.elem
L.listsize+=LIST_INCREMENT; // 增加存储容量
}
q=L.elem+i-1; // q为插入位置
for(p=L.elem+L.length-1;p>=q;--p) // 插入位置及之后的元素右移(由表尾元素开始移)
*(p+1)=*p;
*q=e; // 插入e
++L.length; // 表长增1
return OK;
}
Status ListDelete(SqList &L,int i,ElemType &e) // 算法2.5
{ // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)
// 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1
ElemType *p,*q;
if(iL.length) // i值不合法
return ERROR;
p=L.elem+i-1; // p为被删除元素的位置
e=*p; // 被删除元素的值赋给e
q=L.elem+L.length-1; // q为表尾元素的位置
for(++p;p<=q;++p) // 被删除元素之后的元素左移(由被删除元素的后继元素开始移)
*(p-1)=*p;
L.length--; // 表长减1
return OK;
}
void ListTraverse(SqList L,void(*visit)(ElemType&))
{ // 初始条件:顺序线性表L已存在
// 操作结果:依次对L的每个数据元素调用函数visit()
// visit()的形参加'&',表明可通过调用visit()改变元素的值
ElemType *p=L.elem; // p指向第1个元素
int i;
for(i=1;i<=L.length;i++) // 从表L的第1个元素到最后1个元素
visit(*p++); // 对每个数据元素调用visit()
printf("
");
}
// func2-2.cpp 几个常用的函数
Status equal(ElemType c1,ElemType c2)
{ // 判断是否相等的函数
if(c1==c2)
return TRUE;
else
return FALSE;
}
int comp(ElemType a,ElemType b)
{ // 根据ab,分别返回-1、0或1
if(a==b)
return 0;
else
return (a-b)/abs(a-b);
}
void print(ElemType c)
{ // 以十进制整型的格式输出元素的值
printf("%d ",c);
}
void print1(ElemType &c)
{ // 以十进制整型的格式输出元素的值(设c为引用类型)
printf("%d ",c);
}
void print2(ElemType c)
{ // 以字符型的格式输出元素的值
printf("%c ",c);
}
// main2-1.cpp 检验bo2-1.cpp的主程序
#include"c1.h"
typedef int ElemType; // 定义ElemType为整型
#include"c2-1.h" // 线性表的顺序存储结构
#include"bo2-1.cpp" // 线性表顺序存储结构的基本操作
#include"func2-2.cpp" // 包括equal()、comp()、print()、print1()和print2()函数
Status sq(ElemType c1,ElemType c2)
{ // 数据元素判定函数(平方关系),LocateElem()调用的函数
if(c1==c2*c2)
return TRUE;
else
return FALSE;
}
void dbl(ElemType &c)
{ // ListTraverse()调用的另一函数(元素值加倍)
c*=2;
}
void main()
{
SqList L;
ElemType e,e0;
Status i;
int j,k;
InitList(L); // 初始化线性表L
printf("初始化L后,L.length=%d,L.listsize=%d,L.elem=%u
",L.length,
L.listsize,L.elem);
for(j=1;j<=5;j++)
i=ListInsert(L,1,j); // 在L的表头插入j
printf("在L的表头依次插入1~5后,*L.elem=");
for(j=1;j<=5;j++)
printf("%d ",*(L.elem+j-1)); // 依次输出表L中的元素
printf("
调用ListTraverse()函数,依次输出表L中的元素:");
ListTraverse(L,print1); // 依次对表L中的元素调用print1()函数(输出元素的值)
i=ListEmpty(L); // 检测表L是否空
printf("L.length=%d(改变),L.listsize=%d(不变),",L.length,L.listsize);
printf("L.elem=%u(不变),L是否空?i=%d(1:是 0:否)
",L.elem,i);
ClearList(L); // 清空表L
i=ListEmpty(L); // 再次检测表L是否空
printf("清空L后,L.length=%d,L.listsize=%d,",L.length,L.listsize);
printf("L.elem=%u,L是否空?i=%d(1:是 0:否)
",L.elem,i);
for(j=1;j<=10;j++)
ListInsert(L,j,j); // 在L的表尾插入j
printf("在L的表尾依次插入1~10后,L=");
ListTraverse(L,print1); // 依次输出表L中的元素
printf("L.length=%d,L.listsize=%d,L.elem=%u
",L.length,L.listsize,L.elem);
ListInsert(L,1,0); // 在L的表头插入0,增加存储空间
printf("在L的表头插入0后,L.length=%d(改变),L.listsize=%d(改变),"
"L.elem=%u(有可能改变)
",L.length,L.listsize,L.elem);
GetElem(L,5,e); // 将表L中的第5个元素的值赋给e
printf("第5个元素的值为%d
",e);
for(j=10;j<=11;j++)
{ k=LocateElem(L,j,equal); // 查找表L中与j相等的元素,并将其位序赋给k
if(k) // k不为0,表明有符合条件的元素
printf("第%d个元素的值为%d,",k,j);
else // k为0,没有符合条件的元素
printf("没有值为%d的元素
",j);
}
for(j=3;j<=4;j++) // 测试2个数据
{ k=LocateElem(L,j,sq); // 查找表L中与j的平方相等的元素,并将其位序赋给k
if(k) // k不为0,表明有符合条件的元素
printf("第%d个元素的值为%d的平方,",k,j);
else // k为0,没有符合条件的元素
printf("没有值为%d的平方的元素
",j);
}
for(j=1;j<=2;j++) // 测试头2个数据
{ GetElem(L,j,e0); // 将表L中的第j个元素的值赋给e0
i=PriorElem(L,e0,e); // 求e0的前驱,如成功,将值赋给e
if(i==ERROR) // 操作失败
printf("元素%d无前驱,",e0);
else // 操作成功
printf("元素%d的前驱为%d
",e0,e);
}
for(j=ListLength(L)-1;j<=ListLength(L);j++) // 最后2个数据
{ GetElem(L,j,e0); // 将表L中的第j个元素的值赋给e0
i=NextElem(L,e0,e); // 求e0的后继,如成功,将值赋给e
if(i==ERROR) // 操作失败
printf("元素%d无后继
",e0);
else // 操作成功
printf("元素%d的后继为%d,",e0,e);
}
k=ListLength(L); // k为表长
for(j=k+1;j>=k;j--)
{ i=ListDelete(L,j,e); // 删除第j个数据
if(i==ERROR) // 表中不存在第j个数据
printf("删除第%d个元素失败。",j);
else // 表中存在第j个数据,删除成功,其值赋给e
printf("删除第%d个元素成功,其值为%d",j,e);
}
ListTraverse(L,dbl); // 依次对元素调用dbl(),元素值乘2
printf("L的元素值加倍后,L=");
ListTraverse(L,print1); // 依次输出表L中的元素
DestroyList(L); // 销毁表L
printf("销毁L后,L.length=%d,L.listsize=%d,L.elem=%u
",L.length,
L.listsize,L.elem);
}
/***
*
*题目:已知线性表中的元素以值递增有序排列,并以单链表做存储结构。试写一高效的算法,
* 删除表中所有值大于 mink 且小于 maxk 的元素(若表中存在这样的元素),同时释放
* 被删除节点空间,并分析你的算法的时间复杂度(注意:mink 和 maxk 是给定的两个
* 参变量,它们的值可以和表中的元素相同,也可以不同)
*
****/
#include
#include
#include "DynaLinkList.h"
void DelMminMax(LinkList *L, int min, int max)
{
LinkList p = (*L)->next, q = (*L), r;
while (p && p->data <= min)
{
q = p; p = p->next;
}
while ( p && p->data < max)
{
r = p; p = p->next;
q->next = p; free(r);
}
} //算法的时间复杂度为O(n)
int main()
{
LinkList L;
ElemType e, min, max;
InitList(&L);
printf("输入8个元素建立线性表L(元素递增有序):
");
for (int i=1; i<=8; i++)
{
scanf("%d", &e);
ListInsert(&L, i, e);
}
printf("表L是:
");
ListTraverse(L, visit);
printf("请输入待删除的元素的区间是(min,max):
");
scanf("%d%d", &min, &max);
DelMminMax(&L,min,max);
printf("删除(%d,%d)之间的元素后表L是:
",min,max);
ListTraverse(L, visit);
return 0;
}
很高兴为楼主解答,首先你有三个节点L,p, q,根据你的意思L为头结点,p是有数据x,e的结点,并且p是L的下一个结点,然而q=L->next?,但L下一个结点是什么?不知道吧!这里应该是L->next=q,说明q也是指向p,说白了就是p,q指向同一个空间,接着楼主忽略了p=p->next!!!!,p->next是什么?也就是p的下一个结点是什么??不知道吧!你就直接p后移到p的下一个结点当然会出错,造成内存泄露!这里就有两处错误了
帮你修改后的代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int x;
int e;
struct LNode *next;
}LNode,*LinkList;
int main()
{
LinkList L,p,q;
L=(LinkList)malloc(sizeof(struct LNode));
L->next=NULL;
p=(LinkList)malloc(sizeof(struct LNode));
L->next = p; //这里修改后的
p->x=4;
p->e=5;
// p=p->next;
p->next=NULL;//p下一个结点置空
q=L->next;
printf("%d %d
",q->e,q->x);
return 0;
}
希望楼主满意!!
p=L->next;这句话是不是想写成L->next=p;
要不然你的q指向的都是空,肯定断错误
数据结构(C语言版),求高手解决。。
7.完全二叉树的存储结构通常采用顺序存储结构( )【答案】√ 8.哈夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近( )【答案】√ 9.在中序线索二叉树中,每一非空的线索均指向其祖先结点( )【答案】√ 【解析】在二叉树上,对有左右子女的结点,其中序前驱是其左...
求教一题数据结构(C语言)
五 1.外循环共执行n-2次。对于每次外循环,内循环依次执行:n-2次,n-1次,...2次,1次。内循环共执行1+2+...+n-3+n-2=0.5(n-2)(n-1),所以时间复杂度是O(n^2)。五 2.当i=1时,最内层循环执行1次,当i=2时,最内层循环执行1+(1+2)次,当i=3时,最内层循环执行1+(...
求C语言大神帮忙,一道数据结构题,删除单链表中最大和次最大的数,感激...
include <stdio.h>#define elemType int#define status int#define OVERFLOW -1#define ERROR 0#define OK 1\/* 单链表数据结构 *\/typedef struct lNode {elemType data;struct lNode *next;} lNode, *linkList;\/*** 以下为函数声明 ***\/void initList (linkList *L);\/* 初始化 *\/status ...
一份C语言的数据结构题目,急求答案
第一题;Search (BiTree t,ElemType x){ struct nodee;{BiTree pp;int tag;}s[100];int top; Bitree p;top=0; p=t;while(p!=NULL&&p->p!=NULL){while(p!=NULL&&p->data!=x){top++;s[top].pp=p;s[top].tag=0;p=p->lchild;} if(p!=NULL&&p->data==x){for(i=1...
C语言一道数据结构题目求解
很高兴为楼主解答,首先你有三个节点L,p, q,根据你的意思L为头结点,p是有数据x,e的结点,并且p是L的下一个结点,然而q=L->next?,但L下一个结点是什么?不知道吧!这里应该是L->next=q,说明q也是指向p,说白了就是p,q指向同一个空间,接着楼主忽略了p=p->next!!!,p->next是什...
c语言编程 数据结构题
*\/#include <stdio.h>#include <malloc.h>#include <stdlib.h>typedef struct node{ int a; struct node *next;} NODE;\/\/ 创建顺序链表,长度listSize,并初始化NODE *createlist(NODE *head, int listSize, int arr[]);\/\/ 插入一个节点int insertnode(NODE *head, int index, int...
关于c语言数据结构的一道题
先设0 是最大的 给max 用max和1比较 较大的赋给max max再和2比较 较大的赋给max 循环到底 max就是最大值
几个c语言数据结构题目 急求答案
我有第四题的答案:程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21...include<stdio.h> void main(){ long f1,f2;int i;f1=f2=1;for(i=1;i<=20;i++){ printf("%12ld %12ld",f1,f2);if(i%2==0) printf("\\n");\/*控制输出,每行四个*\/ f1=f1+f2; \/*前两个月加...
请用c语言写,数据结构的题一个带头指针的单链表,写出在其值为x的结点...
include <stdio.h>#include <malloc.h>typedef struct st{ int id; struct st *next; struct st *tailST;}ST;ST *getSTS(int len);\/\/获取一个链表,节点个数为len,返回链表首地址ST *getST(ST *headST,int con);\/\/获取第con个节点void printfST(ST *headST);\/\/打印链表int...
C语言版的数据结构问题:数据结构和数据类型的关系?
数据结构 用 struct 定义 比如: struct A {int a, char b, A *p} *pA;那么A属于一个数据结构,a,b,p都属于数据元素。A的初始大小是四个字节,既元素最大的一个的空间。。。里面的成员同时存在,各自有各自的地址,互不干扰。既pA->a,pA->b,pA->p是可以同时存在滴。数据类型 用...
祖奖金替: /*** * *题目:已知线性表中的元素以值递增有序排列,并以单链表做存储结构.试写一高效的算法, * 删除表中所有值大于 mink 且小于 maxk 的元素(若表中存在这样的元素),同时释放 * 被删除节点空间,并分析你的算法的时间复杂度(注意...
日喀则市13971883313: 数据结构题目,用c语言实现. - ?
祖奖金替: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 /* ------数据类型预定义------ */ typedefintStatus; //函数结果状态类型 /* ------函数结...
日喀则市13971883313: C语言版数据结构编程题 - ?
祖奖金替: //试编写一道在单链表中数据域值为a的结点之后,//插入一个新结点的算法.若原链表中无数据域值为a的结点,//则把新结点插入到表尾.设新结点数据域值为x.小弟初学,谢谢大家啦//定义结点 typedef struct node{ int data; struct node *next; }LNode...
日喀则市13971883313: 一个C语言版数据结构问题.求解释,为什么? 下面的叙述不正确的是( B.C ) - ?
祖奖金替:[选项] A. 线性表在链式存储时,查找第i个元素的时间同i的值成正比 B. 线性表在链式存储时,查找第i个元素的时间同i的值无关 C. 线性表在顺序存储时,查找第i个元素的时间同i 的值成正比 D. 线性表在顺序存储时,查找第i个元素的时间同i的值无关 为什么选B,C
日喀则市13971883313: 数据结构算法(c语言) 迷宫求解 - ?
祖奖金替: 注释非常详细,希望对你有所帮助. #include<stdio.h> #include<stdlib.h> #define M 15 #define N 15 struct mark //定义迷宫内点的坐标类型 { int x; int y; };struct Element //"恋"栈元素,嘿嘿.. { int x,y; //x行,y列 int d; //d下一步的方向 };...
日喀则市13971883313: 求解一道数据结构的题目,用C语言解,考试用的,急,谢谢. - ?
祖奖金替: 特别说明:把c1.h,C2-1.H,Bo2-1.cpp,Func2-2.cpp,Main2-1.cpp 它们分别单独存为文件,然后把他们放在一个文件夹中,最后双击Main2-1.cpp.// c1.h (文件名) #include<string.h> // 字符串函数头文件 #include<ctype.h> // 字符函数头文件 #...
日喀则市13971883313: c语言版数据结构简单题目求解?
祖奖金替: 都是些细节你没有注意,修改的东西如下 : typedef int status; typedef struct LNode { int data; struct LNode *next; }LNode,*LinkList; void CreateList(LinkList *L,int n) { int i; LinkList p; *L=(LinkList)malloc(sizeof(LNode)); (*L)->next=NULL; for(i=n;i>0;...
日喀则市13971883313: 数据结构(C语言版)的一道题 - ?
祖奖金替: 楼主,你好,我前天恰好做了一道类似的题,代码如下,我都给你注释了 struct staff *reverse(struct staff *head) //struct staff是个结构体 { struct staff *p,*q,*temp,*o;q=head; //q指针始终保持在p的前一个结点处 p=head->next; //利用p指针从第2个...
日喀则市13971883313: 求解有关C语言数据结构的题?
祖奖金替: 答案不一样是指还没有完全进栈就有一部分元素出栈push 1push 2poppush 3poppop那么结果就是231
日喀则市13971883313: 数据结构习题:编写判断一个字符序列是否是回文的函数.非常急,《数据结构 - 使用C语言》第四版,朱战立编的.84页习题3 - 18.编写判断一个字符序列是否是... - ?
祖奖金替:[答案] //首先我认为回文不一定是奇数个;也有可能是偶数个;只要这个字符串 //正读跟反读都一样 那它就是回文 所以不应该把字符串的个数当成是判断回文串的 //一个条件. #include #include #include bool huiWen(const char *p); int main() { char test[225]; ...