c语言数据结构考试题
㈠ c语言题型,数据结构题
#include <stdio.h>
#include <malloc.h>
typedef struct student
{
char name[20];
long num;
char sex;
struct student *pNext;
}Stu, *pStu;
void creatInfo(pStu *stu);
int deletInfo(pStu stu, long numTemp);
void printInfo(pStu stu);
int main(void)
{
long numTemp = 0;
pStu myStu = NULL;
creatInfo(&myStu);
scanf("%ld", &搏御numTemp);
if(1 == deletInfo(myStu, numTemp))
printInfo(myStu);
return 0;
}
void creatInfo(pStu *stu)
{
int n = 1;
pStu pNew = NULL, pTail = NULL;
*stu = (pStu)malloc(sizeof(Stu));
if(*stu == NULL)
return ;
(*stu)->pNext = NULL;
pTail = *stu;
while(n <= 10)
{
pNew = (pStu)malloc(sizeof(Stu));
if(NULL == pNew)
return ;
pNew->pNext = NULL;
scanf("%s", pNew->name);
if('#' == pNew->name[0])
{
free(pNew);
pNew = NULL;
return ;
}
scanf("%ld %c", &pNew->num, &pNew->sex);
pTail->薯行pNext = pNew;
pTail = pNew;
++n;
}
}
int deletInfo(pStu stu, long numTemp)
{
pStu pTail = NULL, pHead = NULL;
pHead = stu;
pTail = stu->pNext;
while(pTail)
{
if(pTail->num == numTemp)
{
pHead->pNext = pTail->pNext;
free(pTail);
pTail = NULL;
return 1;
}
pTail = pTail->pNext;
pHead = pHead->pNext;
}
printf("链表中唔基手岩该学生! ");
return 0;
}
void printInfo(pStu stu)
{
while(stu = stu->pNext)
printf("%s, %d, %c ", stu->name, stu->num, stu->sex);
}
㈡ 急需数据结构C语言版(清华大学出版社)的期末考试试题及答案
《数据结构》期末考试试卷( A )
一、 选择题(每小题2分,共24分)
1.计算机识别、存储和加工处理的对象被统称为( A )
A.数据 B.数据元素
C.数据结构 D.数据类型
2.栈和队列都是( A )
A.限制存取位置的线性结构 B.顺序存储的线性结构
C.链式存储的线性结构 D.限制存取位置的非线性结构
3.链栈与顺序栈相比,比较明显的优点是( D )
A.插入操作更加方便 B.删除操作更加方便
C.不会出现下溢的情况 D.不会出现上溢的情况
4.采用两类不同存储结构的字符串可分别简称为( B )
A.主串和子串 B.顺序串和链串
C.目标串和模式串 D.变量串和常量串
5. 一个向量第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是:B
A. 110 B .108
C. 100 D. 120
6.串是一种特殊的线性表,其特殊性体现在:B
A.可以顺序存储 B .数据元素是一个字符
C. 可以链接存储 D. 数据元素可以是多个字符
7.设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为: C
A. 2h B .2h-1
C. 2h+1 D. h+1
软件开发网
8.树的基本遍历策略可分为先根遍历和后根遍历;二叉树的基本遍历策略可分为先序遍历、中序遍历和后序遍历。这里,我们把 由树转化得到的二叉树叫做这棵树对应的二叉树。下列结论哪个正确? A
A. 树的先根遍历序列与其对应的二叉树的先序遍历序列相同
B .树的后根遍历序列与其对应的二叉树的后序遍历序列相同
C. 树的先根遍历序列与其对应的二叉树的中序遍历序列相同
D. 以上都不对
9.一个有n个顶点的无向图最多有多少边?C
A. n B .n(n-1)
C. n(n-1)/2 D. 2n
10.在一个图中,所有顶点的度数之和等于所有边数的多少倍?C
A. 1/2 B .1
C. 2 D. 4
11.当在二叉排序树中插入一个新结点时,若树中不存在与待插入结点的关键字相同的结点,且新结点的关键字小于根结点的关键字,则新结点将成为( A )
A.左子树的叶子结点 B.左子树的分支结点
C.右子树的叶子结点 D.右子树的分支结点
软件开发网
12.对于哈希函数H(key)=key%13,被称为同义词的关键字是( D )
A.35和41 B.23和39
C.15和44 D.25和51
二、已知某棵二叉树的前序遍历结果为A,B,D,E,G,C,F,H,I,J,其中中序遍历的结果为D,B,G,E,A,H,F,I,J,C。请画出二叉的具体结构。(注意要写出具体步骤)(10分)
原理见课本128页
三、有图如下,请写出从顶点c0出发的深度优先及宽度优先遍历的结果。(10分)
深度优先;C0-C1-C3-C4-C5-C2
宽度优先:C0-C1-C2-C3-C4-C5
四、有图如下,按Kruskal算法求出其最小生成树。要求写出完整的步骤。(10分)
原理见课本250页
五、给定线性表(12,23,45,66,76,88,93,103,166),试写出在其上进行二分查找关键字值12,93,166的过程。并写出二分查找的算法。(20分)
0 1 2 3 4 5 6 7 8
12 23 45 66 76 88 93 103 166
过程:
mid=(0+8)/2=4
high=3,low=0 mid=1
high=0,low=0 mid=0(找到12)
high=8,low=5,mid=6(找到93)
high=8,low=7,mid=7
high=8 low=8 mid=8
算法:见课本84页上
六、知单链表的结点结构为
Data next
下列算法对带头结点的单链表L进行简单选择排序,使得L中的元素按值从小到大排列。
请在空缺处填入合适的内容,使其成为完整的算法。 (可用文字说明该算法的基本思想及执行的过程,10分)
void SelectSort(LinkedList L)
{
LinkedList p,q,min;
DataType rcd;
p= (1) ;
while(p!=NULL) {
min=p;
q=p->next;
while(q!=NULL){
if( (2) )min=q;
q=q->next;
}
if( (3) ){
rcd=p->data;
p->data=min->data;
min->data=rcd;
}
(4) ;
}
}
本题不会。嘿嘿。。。。
七、一个完整的算法应该具有哪几个基本性质?分别简要说明每一性质的含意。(5分)
输入:
四个基本性质:1.输入:有零个或多个有外部提供的量作为算法的输入
2:输出:算法产生至少一个量作为输出
3.:确定性:组成算法的每条指令是清晰的,无歧异的。
4.:有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的
八、何谓队列的"假溢"现象?如何解决?(5分)
队列的假溢现象是指数组实现的顺序队列中,队尾指针已到达数组的下表上界产生上溢而队头指针之前还有若干 空间闲置的现象。解决的办法之一是利用循环队列技术使数组空间的首尾相连。
九、说明并比较文件的各种物理结构。(6分)
㈢ 数据结构(c语言版)题目求答案
3.28
void InitCiQueue(CiQueue&Q)//初始化循环链表表示的队列Q
{
Q=(CiLNode*)malloc(sizeof(CiLNode));
Q->next=Q;
}//InitCiQueue
voidEnCiQueue(CiQueue&Q,int x)//把元素x插入循环列表表示的队列Q,Q指向队尾元素,Q->next指向头结点,Q->next->next指向队尾元素
{
p=(CiLNode*)malloc(sizeof(CiLNode));
p->data=x;
p->next=Q->next;//直接把p加在Q的后面
Q->next=p;
Q=p;//修改尾指针
}
Status DeCiQueue(CiQueue&Q,int x)//从循环链表表示的队列Q头部删除元素x
{
if(Q==Q->next)return INFEASIBLE;//队列已空
p=Q->next->next;
x=p->data;
Q->next->next=p->next;
free(p);
rturn OK;
}//DeCiqueue
3.31
int Palindrome_Test()
{
InitStack(S);InitQueue(Q);
while((c=getchar())!='@')
{
Push(S,c);EnQueue(Q,c);
}
while(!StackEmpty(S))
{
pop(S,a);DeQueue(Q,b);
if(a!=b)return ERROR;
}
return OK;
}
㈣ c语言编程 数据结构题
参考代码如下:(手打不易,望采纳!)
/*
创建线性顺序表其最大长度为20,
在顺序表中节点的值为{1,4,6,7,10},
然后在下标为2的位置插入5打印输出,
然后删除值为7的元素并打印输出。
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedefstructnode
{
inta;
structnode*next;
}NODE;
//创建顺序链表,长度listSize,并初始化
NODE*createlist(NODE*head,intlistSize,intarr[]);
//插入一个节点
intinsertnode(NODE*head,intindex,intval);
//删除一个节点
intdelnode(NODE*head,intval);
//打印链表信息
voidprintlist(NODE*head);
//主函数
intmain(intargc,charconst*argv[])
{
intarr[5]={1,4,6,7,10};
intarrlen;
arrlen=(int)sizeof(arr)/(int)sizeof(int);
NODE*head=NULL;
head=createlist(head,arrlen,arr);
if(NULL==head)
{
printf("Failedtocreatelist.ProgramEixt. ");
return0;
}
printf(" ");
printlist(head);
if(1==insertnode(head,2,5))
{
printf(" Insertedanodebeforeindex2, ");
printlist(head);
}
else
{
printf(" FailedtoInsertanode. ");
}
if(1==delnode(head,7))
启数{
printf(" Deletedanodewithvalueof7, ");
printlist(head);
}
else
{
printf(" Nonodedeleted:valueisnot悄瞎首exist. ");
}
return0;
}
//创建顺序链表,长度listSize,并初始化
NODE*createlist(NODE*head,intlistSize,intarr[])
{
head=(NODE*)malloc(sizeof(NODE));
if(NULL==head)
{
printf("Oops!MallocFailed!ProgramExit! ");
returnNULL;
}
NODE*p,*q;
p=head;
for(inti=0;i<listSize;i++)
{
q=(NODE*)malloc(sizeof(NODE));
if(NULL==q)
{
printf("Oops!MallocFailed!ProgramExit! ");
returnNULL;
}
q->next=NULL;
if(i<5)
{
q->a=arr[i];
}
p->next=q;
神笑p=q;
q=q->next;
}
returnhead;
}
//插入一个节点
intinsertnode(NODE*head,intindex,intval)
{
NODE*p=head;
NODE*q=NULL;
inti,count=0;
while(NULL!=p->next)
{
count++;
p=p->next;
}
if(index>count||index<0)
{
printf("Lengthoflistis%d,.[0,%d] ",count,count);
printf("Nothinghasbeenadded. ");
return0;
}
p=head->next;
q=head;
for(i=0;i<=index;i++)
{
if(index==i)
{
NODE*n=(NODE*)malloc(sizeof(NODE));
if(NULL==n)
{
printf("Oops!MallocFailed!ProgramExit! ");
return0;
}
n->a=val;
n->next=p;
q->next=n;
return1;
}
p=p->next;
q=q->next;
}
return0;
}
//删除一个节点
intdelnode(NODE*head,intval)
{
NODE*p,*q;
p=head->next;
q=head;
while(p!=NULL)
{
if(val==p->a)
{
p=p->next;
q->next=p;
return1;
}
else
{
p=p->next;
q=q->next;
}
}
return0;
}
//打印链表信息
voidprintlist(NODE*head)
{
NODE*p;
p=head->next;
inti=0;
if(NULL!=p)
{
printf("PrintListinfoasbelow: ");
while(NULL!=p)
{
printf("NodeatIndex%d,valueis%d. ",i,p->a);
i++;
p=p->next;
}
}
else
{
printf("Listisempty. ");
}
}
Linux环境运行截图:
以上,如有帮助,烦请点采纳,谢谢!
㈤ c语言编程 数据结构题
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#defineelemTypeint /*单链表元素数据类型*/
#defineLNODE_SIZEsizeof(structlNode) /*单链表结点空间大小*/
#definestatusint /*状态型变量*/
#defineOVERFLOW-1 /*内存溢出状态码*/
#defineERROR0 /*错误状态码*/
#defineOK1 /*正确状态码*/
/*单链表数据结构*/
typedefstructlNode{
elemTypedata;
structlNode*next;
}lNode,*linkList;
/*初始化首带*/
/*操作结果:构造一个空的单链表L*/
voidinitList(linkList*L){
*L=(linkList)malloc(LNODE_SIZE);/*产生头结点,并使L指向此头结点*/
if(!*L)/*内存分配失败*/
exit(OVERFLOW);
(*L)->next=NULL;/*指针域为空*/
}
/*销毁*/
/*初始条件:单链表L已存在。操作结果:销毁单链表L*/
voiddestroyList(linkListL){
linkListp,q;
p=毁芹前L->next;/*p指向第一个结点*/
while(p){/*没到表尾*/
q=p->next;
free(p);
p=q;
}
free(L);
}
/*判断单链表是否为空*/
/*初始条件:单链表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE*/
intlistIsEmpty(linkListL){
returnL->next==NULL;
}
/*寻找指定特征(compare)元素的位序*/
/*初始条件:线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)*/
/*操作结果:返回L中第1个与e满足关系compare()的数据元素的位序*/
/*若这样的数据纤清元素不存在,则返回值为0*/
intlocateElem(linkListL,elemTypee,status(*compare)(elemType,elemType)){
inti=0;
linkListp=L->next;
while(p){
i++;
if(compare(p->data,e))/*找到这样的数据元素*/
returni;
p=p->next;
}
return0;
}
/*数据元素判定*/
/*满足为1,否则为0*/
intcompare(elemTypedes,elemTypesrc){
returndes==src;
}
/*单链表指定位置插入新元素*/
/*操作结果:在带头结点的单链表L中第i个位置之前插入元素e*/
statuslistInsertNode(linkListL,inti,elemTypee){
intj=0;
linkListp=L,s;
while(p&&j<i-1){/*寻找第i-1个结点*/
p=p->next;
j++;
}
if(!p||j>i-1)/*插入位置不合理:i小于1或者大于表长*/
returnERROR;
/*生成新结点,并插入L中*/
s=(linkList)malloc(LNODE_SIZE);
if(!s)/*内存分配失败*/
exit(OVERFLOW);
s->data=e;
s->next=p->next;
p->next=s;
returnOK;
}
/*删除单链表指定位置元素*/
/*操作结果:在带头结点的单链线性表L中,删除第i个元素,并由e返回其值*/
statuslistDeleteNode(linkListL,inti,elemType*e){
intj=0;
linkListp=L,q;
while(p->next&&j<i-1){/*寻找第i个结点,并令p指向其前驱结点*/
p=p->next;
j++;
}
if(!p->next||j>i-1)/*删除位置不合理:i小于1或者大于表长*/
returnERROR;
/*删除并释放结点*/
q=p->next;
p->next=q->next;
*e=q->data;
free(q);
returnOK;
}
/*打印链表内容*/
/*初始条件:单链表L已存在。操作结果:当链表不为空时,打印链表内容并返回OK,否则返回ERROR*/
statusprintList(linkListL){
linkListp=L->next;/*p指向第一个结点*/
if(listIsEmpty(L)){
puts("Thelinklistisempty!");
returnERROR;
}
while(p){
printf("%d ",p->data);
p=p->next;
}
putchar(' ');
returnOK;
}
intmain(void){
linkListL;
elemTypee;
intindex;
/*初始化链表*/
initList(&L);
/*插入若干元素*/
listInsertNode(L,1,1);
listInsertNode(L,2,4);
listInsertNode(L,3,6);
listInsertNode(L,4,7);
listInsertNode(L,5,10);
printf("初始链表内容: ");
printList(L);
putchar(' ');
/*寻找数据为6的结点位置*/
index=locateElem(L,6,&compare);
printf("数据为6的结点位置: %d ",index);
putchar(' ');
/*在数据为6的结点之前插入数据为5的结点*/
listInsertNode(L,index,5);
printf("当前链表内容: ");
printList(L);
destroyList(L);
getch();/*屏幕暂留*/
return0;
}
㈥ c语言数据结构(考题,测试你的能力)--编写源代码
考考自己吧
人不能总能依靠别人.
㈦ 数据结构(C语言)题:循环单链表L中,指针P所指结点为尾结点的条件是( )。
如果存在空头结点:
p->next
head
->next
如果不存在空厅型头结点:
p->next
head
判断空链表的条件是:
head==head->next;
rear==rear->next;
(7)c语言数据结构考试题扩展阅读:
用尾指针rear表示的单循环链表对开始结点a1和终端结点an查找时间都是O(1)。而表的操作常常是在表的首尾位置上进行,因此,实用中多采用尾指针表示单循环链表。
在单链表中,从一已知结点出发,只能访问到该结点及其后续结点,无法找到该结点之前的其它结点。而在单循环链表中,从任一结点出发都可访问到表中所有结点,这一优点使某些运算在单循环链表上易于扮皮猜实现。握拍
㈧ 求解一道数据结构的题目,用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> // 字符函数头文件
#include<malloc.h> // malloc()等
#include<limits.h> // INT_MAX等
#include<stdio.h> // 标准输入输出头文件,包括EOF(=^Z或F6),NULL等
#include<stdlib.h> // atoi(),exit()
#include<io.h> // eof()
#include<math.h> // 数学函数头文件,包括floor(),ceil(),abs()等
#include<sys/timeb.h> // ftime()
#include<stdarg.h> // 提供宏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(i<1||i>L.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(i<1||i>L.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(i<1||i>L.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("\n");
}
// func2-2.cpp 几个常用的函数
Status equal(ElemType c1,ElemType c2)
{ // 判断是否相等的函数
if(c1==c2)
return TRUE;
else
return FALSE;
}
int comp(ElemType a,ElemType b)
{ // 根据a<、=或>b,分别返回-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\n",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("\n调用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:否)\n",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:否)\n",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\n",L.length,L.listsize,L.elem);
ListInsert(L,1,0); // 在L的表头插入0,增加存储空间
printf("在L的表头插入0后,L.length=%d(改变),L.listsize=%d(改变),"
"L.elem=%u(有可能改变)\n",L.length,L.listsize,L.elem);
GetElem(L,5,e); // 将表L中的第5个元素的值赋给e
printf("第5个元素的值为%d\n",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的元素\n",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的平方的元素\n",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\n",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无后继\n",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\n",L.length,
L.listsize,L.elem);
}
㈨ 高分求数据结构(C语言)高手做题!(200悬赏+50追加+20采纳=270分)
1.数据结构在计算机中的表示称为数据的( B )。
A)存储结构 B)抽象结构 C)顺序结构 D)逻辑结构
12.在下列序列中,不是线性表的是( D )。
A)('a','b','c') B)('AB','CD') C)('a',true,'c') D)(a,b,c,d)
13.线性链表中各链结点之间的地址( D )。
A)必须连续 B)部分地址必须连续 C)不一定连续 D)连续与否无所谓
14.如某链表中最常用的操作是在最后一个结点后插入一个结点和删除最后一个结点,则( D )存储方式最节省运行时间。
A)单链表 B)带头结点的单链表 C)单循环链表 D)带头结点的双循环链表
26.从一个具有头结点的单链表中查找数据元素值为x的结点时,在查找成功的情况下,平均比较次数是( B)。
A)n B)n/2 C)(n-1)/2 D)(n+1)/2
27.对于长度为n的顺序线性表进行删除元素操作,如删除每个元素的概率相同,则删除一个元素移动元素的平均次数是( B )。
A)n/2 B)(n-1)/2 C)(n+1)/2 D)Dn
38.串是( B )。
A)不少于一个字符的序列 B)有限个字符的序列
C)不少于一个字母的序列 D)任意个字母的序列
40.当矩阵非零元素的位置或个数经常变动时,采用( C )存储结构更为恰当。
A)顺序表 B)三元组表 C)十字链表 D)广义表
41.一个三对角矩阵An×n已按行压缩存储到一维数组B中,则B的长度至少为(C)。
A)3n+1 B)3n C)3n-1 D)3n-2
42.广义表((a,b),(c,d))的表尾是( A )。
A)(c,d) B)((c,d)) C)(d) D)d
44.设一棵二叉树中没有度为1的结点,已知叶子结点数为n,此树的结点数为( B )。
A)2n+2 B)2n+1 C)2n D)2n-1
45.设二叉树中有n2个度为2的结点,n1个度为1的结点,n0个叶子结点,则此二叉树中空指针域个数为( D )。
A)n0+n1+n2 B)n2+n1+2n0 C)2n2+n1 D)2n0+n1
48. A、B两个结点可以构成( C )棵不等价的二叉树。
A)2 B)3 C)4 D)5
49.设哈夫曼树的叶结点数为n,则它的结点总数为( A )。
A)2n-1 B)2n C)2n+1 D)不确定
50.采用邻接表存储的图按深度优先搜索方法进行遍历的算法类似于二叉树的(D )。
A)先序遍历 B)中序遍历 C)后序遍历 D)层次遍历
59.快速排序执行一遍之后,已经到位的元素个数是( A )。
A)1 B)3 C) D)
60.在下列算法中,操作时间不随文件的初始状态变化的排序算法是( B )。
A)堆排序 B)折半插入排序 C)基数排序 D)快速排序
61.数据表中有10000个元素,如果仅需求出其中最大的10个元素,则采用( D )
A)快速排序 B)希尔排序 C)堆排序 D)直接选择排序
62.快速排序在最坏情况下时间复杂度是O(n2),比( D )的性能差。
A)堆排序 B)起泡排序 C)选择排序 D)直接插入排序
63.下列排序算法中一趟结束后未必能选出一个元素放在其最终位置上的算法是(A)。
A)快速排序 B)冒泡排序 C)树形选择排序 D)归并排序
64.若需在O(nlogn)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是( B )。
A)快速排序 B)堆排序 C)归并排序 D)直接插入排序
65.初始文件中有两个关键字相同的记录,通过不稳定的排序方法排序后,(D)。
A)使得领先关系不发生变化 B)领先关系一定发生变化
C)两个位置都不会发生变化 D)领先关系可能发生变化
66.如果只想得到1000个元素组成的序列中第5个最小元素之前的部分排序的序列,用( B )方法平均时间最少。
A)起泡排序 B)简单选择排序 C)Shell排序 D)堆排序问题补充:
77.一组记录的排序码为(48,24,18,53,16,26,40),采用冒泡排序法进行排序,则第一趟排序需要进行记录交换的次数是(C)。
A)3 B)4 C)5 D)6
78.在下列排序方式中,关键码比较次数与记录的初始排列无关的是(D)。
A)直接选择排序 B)冒泡排序 C)堆排序 D)归并排序
79.倒排文件的最大优点是( B)。
A)便于进行文件的归并 B)有利于文件的插入与删除
C)能大大地提高主关键字的查找速度 D)能大大地提高次关键字的查找速度
80.文件中可使用的数据的最小单位是(B )。
A)记录 B)字符 C)数据项 D)数据元素
81.ISAM文件和VASM文件属于(C )。
A)索引非顺序文件 B)索引顺序文件 C)顺序文件 D)散列文件
A)先序遍历 B)中序遍历 C)后序遍历 D)按层遍历
181.使用散列函数hashf(x)=x MOD 11,把一个整数值转换成散列表下标,现要把数据 1、13、12、34、38、33、27、22插入到散列表中。
(1)使用线性探查再散列法来构造散列表并同时列出每个数据的比较次数。
(2)使用链地址法来构造散列
㈩ 系列数据结构(C语言题),感激不尽
1、234
2、*+A+BCDE*FG -+*A-BD/H+DE/S*NT *-AC+BD/-EF+GH
3、1/(n-1)
4、3.3
5、禅悄集合,线性,树形滚袭好和图
6、bceda
15、
void SelectSort(int a[],int n)
{
int l=n,k,x;
for(int i=1;i<=l-1;++i)
{
k=i;
for(int j=i+1;j<=l;++j)
{
if(a[j]<大铅a[k]) k=j;
if(k!=j)
{ x=a[i];r[i]=r[k];r[k]=x; }
}
}
}
16、这个就不知道了 自己好好想想啊