数据结构题目及c语言代码
数据结构经典题目及c语言代码

数据结构经典题目及c语言代码一、线性表1. 顺序表顺序表是一种利用连续存储空间存储元素的线性表。
以下是一个顺序表的经典题目及C语言代码实现:```c#define MaxSize 50typedef struct {int data[MaxSize]; // 存储元素的数组int length; // 顺序表的当前长度} SeqList;// 初始化顺序表void initList(SeqList *L) {L->length = 0;}// 插入元素到指定位置void insert(SeqList *L, int pos, int elem) {if (pos < 1 || pos > L->length + 1) {printf("插入位置无效\n");return;}if (L->length == MaxSize) {printf("顺序表已满,无法插入\n"); return;}for (int i = L->length; i >= pos; i--) { L->data[i] = L->data[i - 1];}L->data[pos - 1] = elem;L->length++;}// 删除指定位置的元素void delete(SeqList *L, int pos) {if (pos < 1 || pos > L->length) {printf("删除位置无效\n");return;}for (int i = pos - 1; i < L->length - 1; i++) {L->data[i] = L->data[i + 1];}L->length--;}// 获取指定位置的元素值int getElement(SeqList *L, int pos) {if (pos < 1 || pos > L->length) {printf("位置无效\n");return -1;}return L->data[pos - 1];}```2. 链表链表是一种利用非连续存储空间存储元素的线性表。
数据结构(C语言版)1800道题及答案[完整版]
![数据结构(C语言版)1800道题及答案[完整版]](https://img.taocdn.com/s3/m/9bcf54fe59f5f61fb7360b4c2e3f5727a5e9240e.png)
数据结构(C语言版)1800道题及答案[完整版]数据结构(C语言版)1800道题及答案[完整版]数据结构1800例题与答案第一章绪论一、选择题(每小题2分)1.算法的计算量的大小称为计算的(B )。
【北京邮电大学2000 二、3 (20/8分)】A.效率 B.复杂性 C.现实性 D.难度2.算法的时间复杂度取决于(C)。
【中科院计算所 1998 二、1 (2分)】A.问题的规模 B.待处理数据的初态 C.A和B D.都不是3.计算机算法指的是(① C ),它必须具备(② B )这三个特性。
① A.计算方法B.排序方法C.解决问题的步骤序列 D.调度方法② A.可执行性、可移植性、可扩充性B.可执行性、确定性、有穷性C.确定性、有穷性、稳定性 D.易读性、稳定性、安全性【南京理工大学1999 一、1(2分)【武汉交通科技大学1996 一、1(4分)】4.一个算法应该是( B )。
【中山大学 1998 二、1(2分)】A.程序 B.问题求解步骤的描述C.要满足五个基本特性 D.A和C.5.下面关于算法说法错误的是( D )【南京理工大学 2000 一、1(1.5分)】A.算法最终必须由计算机程序实现B.为解决某问题的算法同为该问题编写的程序含义是相同的C. 算法的可行性是指指令不能有二义性D. 以上几个都是错误的6. 下面说法错误的是(C )【南京理工大学2000 一、2 (1.5分)】(1)算法原地工作的含义是指不需要任何额外的辅助空间(2)在相同的规模n下,复杂度O(n)的算法在时间上总是优于复杂度O(2n)的算法(3)所谓时间复杂度是指最坏情况下,估算算法执行时间的一个上界(4)同一个算法,实现语言的级别越高,执行效率就越低A.(1) B.(1),(2) C.(1),(4) D.(3)7.从逻辑上可以把数据结构分为( C )两大类。
【武汉交通科技大学 1996 一、4(2分)】A.动态结构、静态结构 B.顺序结构、链式结构C.线性结构、非线性结构 D.初等结构、构造型结构8.以下与数据的存储结构无关的术语是(D )。
数据结构c语言版试题及答案

数据结构c语言版试题及答案一、选择题(每题2分,共10分)1. 在C语言中,以下哪个关键字用于定义结构体?A. structB. unionC. enumD. typedef答案:A2. 若有一个结构体数组,下列哪个函数可以用来初始化数组中的每个元素?A. memsetB. memcpyC. strcpyD. bzero答案:A3. 在C语言中,以下哪个函数用于动态分配内存?A. mallocB. callocC. reallocD. all of the above答案:D4. 对于一个链表,以下哪个操作是正确的?A. 插入节点B. 删除节点C. 遍历链表D. all of the above答案:D5. 在C语言中,以下哪个函数用于释放动态分配的内存?A. freeB. mallocC. callocD. realloc答案:A二、填空题(每题3分,共15分)1. 结构体定义的关键字是______。
答案:struct2. 在C语言中,动态分配内存失败时,malloc函数返回______。
答案:NULL3. 单链表的头节点指针通常初始化为______。
答案:NULL4. 双向链表中,每个节点包含______个指针。
答案:两个5. 树的深度优先遍历包括______、中序遍历和后序遍历。
答案:前序遍历三、简答题(每题5分,共20分)1. 请简述C语言中结构体和联合体的区别。
答案:结构体(struct)可以包含不同类型的数据,并且可以有多个实例;联合体(union)可以包含不同类型的数据,但是只能有一个实例,即在任意时刻只能存储其中一个成员的值。
2. 动态内存分配的优点是什么?答案:动态内存分配允许程序在运行时根据需要分配内存,这样可以更有效地使用内存资源,并且可以创建大小不固定的数据结构。
3. 链表相比于数组有哪些优点?答案:链表的优点包括动态大小,可以灵活地插入和删除节点,不需要预先知道数据的大小。
数据结构c语言期末考试题库及详解答案

数据结构c语言期末考试题库及详解答案数据结构C语言期末考试题库及详解答案一、选择题1. 在数据结构中,线性表的顺序存储结构被称为:A. 链式存储结构B. 栈C. 队列D. 数组答案:D2. 下列关于栈的描述,错误的是:A. 栈是一种特殊的线性表B. 栈的特点是后进先出C. 栈顶元素是最后插入的元素D. 栈的插入和删除操作都发生在栈顶答案:C二、填空题1. 在C语言中,定义一个具有10个元素的整型数组可以使用语句:________。
答案:int arr[10];2. 链表与数组相比,其优点是________。
答案:动态内存分配,不需要预先知道数据规模三、简答题1. 简述二叉树的遍历方法有哪些,并说明它们的特点。
答案:二叉树的遍历方法主要有前序遍历、中序遍历和后序遍历三种。
前序遍历首先访问根节点,然后递归地遍历左子树和右子树;中序遍历首先遍历左子树,然后访问根节点,最后遍历右子树;后序遍历首先遍历左子树和右子树,最后访问根节点。
每种遍历方法都可以用来对二叉树进行不同的操作和分析。
2. 什么是哈希表?它在实际应用中有哪些优点?答案:哈希表是一种通过哈希函数将键映射到表中一个位置来访问记录的数据结构。
它的优点包括:快速的数据访问速度,因为哈希表通常在常数时间内完成查找;动态的内存分配,可以根据需要调整存储空间;以及灵活的键值对存储方式。
四、编程题1. 编写一个C语言函数,实现单链表的逆序输出。
答案:```c#include <stdio.h>#include <stdlib.h>typedef struct Node {int data;struct Node *next;} Node;void reversePrint(Node *head) {if (head == NULL) return;reversePrint(head->next);printf("%d ", head->data);}int main() {Node *head = (Node *)malloc(sizeof(Node));head->data = 1;head->next = NULL;// 假设链表已经构建完毕reversePrint(head);return 0;}```2. 请实现一个C语言函数,用于计算一个字符串中不同字符的数量。
数据结构试题及答案c语言版

数据结构试题及答案c语言版一、选择题(每题2分,共20分)1. 在C语言中,以下哪个选项是正确的链表定义?A. struct Node { int data; struct Node *next; };B. struct Node { int data; Node *next; };C. struct Node { int data; struct Node *next; } *Node;D. struct Node { int data; Node *next; };答案:A2. 下列关于栈的描述中,错误的是?A. 栈是一种后进先出(LIFO)的数据结构。
B. 栈的插入操作称为push。
C. 栈的删除操作称为pop。
D. 栈可以存储任意数量的数据。
答案:D3. 在C语言中,以下哪个关键字用于定义一个结构体?A. structB. unionC. enumD. typedef答案:A4. 下列关于队列的描述中,正确的是?A. 队列是一种先进先出(FIFO)的数据结构。
B. 队列只能从队尾进行插入操作。
C. 队列的插入操作称为pop。
D. 队列的删除操作称为push。
答案:A5. 在C语言中,以下哪个函数用于创建一个动态数组?A. mallocB. callocC. reallocD. all of the above答案:D6. 下列关于二叉树的描述中,错误的是?A. 二叉树的每个节点最多有两个子节点。
B. 二叉树的子节点被称为左子树和右子树。
C. 二叉树的遍历方式包括前序、中序、后序。
D. 二叉树的每个节点只能有一个子节点。
答案:D7. 在C语言中,以下哪个函数用于释放动态分配的内存?A. freeB. mallocC. callocD. realloc答案:A8. 下列关于图的描述中,错误的是?A. 图是由顶点和边组成的数据结构。
B. 图的边可以是有向的,也可以是无向的。
C. 图的顶点可以是孤立的,没有边与之相连。
数据结构代码题目

/*ppt作业建立一个线性表,首先依次输入数据元素1,2,3, …,10,然后删除数据元素5,最后依次显示当前线性表中的数据元素。
要求采用单链表实现。
*/#include<stdlib.h>#include<stdio.h>#include "mqb.h"LinkList p,q,s;void CreateList_L(LinkList &L,int n){//创建线性表int i;L=(LNode*)malloc(sizeof (LNode));L->next=NULL;p=L;for (i=1;i<=n;i++){q=(LNode*)malloc(sizeof(LNode));if(!p) exit(OVERFLOW);scanf("%d",&q->data);q->next=NULL;p->next=q;p=q;}}Status ListDelete_L(LinkList &L,int i,ElemType &e){//单个删除元素LinkList q;p=L;int j=0;while(p->next&&j<i-1){p=p->next;++j;}if(!(p->next)||j>i-1)return ERROR;q=p->next;p->next=q->next;e=q->data;free(q);return OK;}void PrintList(LinkList &L){//输出p=L->next;while(p!=NULL){printf("%-3d",p->data);p=p->next;}}void main(){LinkList L;ElemType e;printf("请输入1-10十个元素,用空格隔开\n");CreateList_L(L,10);printf("你选择的是“删除元素中的元素数据5”\n\n");ListDelete_L(L,5,e);printf("………\n\n………\n\n删除5完毕后的元素为:\n");PrintList(L);}头文件#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;typedef char ElemType;typedef struct LNode{ElemType data;struct LNode*next;}LNode,*LinkList;。
大学《数据结构》(C语言版)课程实验题目及参考代码 鲁东大学by ZYC

数据结构实验实验一线性表的基本操作实验二栈和队列实验三二叉树的操作实验四图的遍历实验五查找实验六排序实验一线性表的基本操作(1)实验要求:分别采用线性表的两种存储结构(顺序存储结构、链式存储结构)来实现以上基本操作。
(2)实验目的:了解线性表的基本概念,掌握线性表的两种存储结构——顺序存储和链式存储,掌握在两种存储结构上实现线性表的基本操作,掌握用C上机调试线性表操作的基本方法。
(3)实验内容:a.输入一组整型元素序列,建立线性表。
b.实现该线性表的遍历。
c.在该线性表中查找某一元素,查找成功显示查找元素,否则显示查找失败。
d.在该线性表中删除或插入指定元素。
(4)参考代码:#include<stdio.h>#include<stdlib.h>#define SIZE 20#define MORE 10typedef struct{int *base; //存储空间基址int length; //当前长度int listsize; //当前存储容量}SqList;void InitList(SqList &L){//构造线性表L.base=(int *)malloc(SIZE*sizeof(int));if(!L.base)exit(0);L.listsize=SIZE;scanf("%d",&L.length);printf("输入表中元素:\n");for(int i=0;i<L.length;i++)scanf("%d",&L.base[i]);}void Output(SqList L){//遍历for(int i=0;i<L.length;i++)printf("%5d",L.base[i]);printf("\n");}void Locate(SqList L,int &e){//查找int i;for(i=0;i<=L.length;i++){if(L.base[i]==e){printf("查找成功\n");break;}}if(i>L.length)printf("查找失败\n");}void Delete(SqList &L,int i,int &e){//删除第i个元素int j;if(i<1||i>L.length) exit(0);e=L.base[i-1];for(j=i-1;j<L.length;j++){L.base[j]=L.base[j+1];}L.length--;}void Insert(SqList &L,int i,int e){//插入SqList q,p;int j;if(i<1||i>L.length+1)exit(0);if(L.length>=L.listsize){int *newbase=(int *)realloc(L.base,(L.listsize+MORE)*sizeof(int));if(!newbase) exit(0);L.base=newbase;L.listsize+=MORE;}for(j=L.length-1;j>=i-1;j--){L.base[j+1]=L.base[j];}L.base[i-1]=e;L.length++;}void main(){SqList La,Lb,Lc;int d,k,e;printf("输入表的长度:\n");InitList(La);printf("输入要查找的数:\n");scanf("%d",&d) ;Locate(La,d);printf("要删除第几个数?\n");scanf("%d",&k);Delete(La,k,e);printf("删除的数为:%d\n",e);printf("删除后的表为:\n");Output(La);int a,b;printf("输入要插入的位置和数:\n");scanf("%d%d",&a,&b);Insert(La,a,b);printf("插入后的表为:\n");Output(La);}实验二栈和队列(1)实验要求:掌握栈和队列的类型定义方法;掌握栈在两种不同的存储结构上实现的五种基本操作;掌握在循环队列上实现队列的基本操作,并能灵活运用以上栈和队列知识对现实生活中的实际问题提出解决方案。
数据结构习题(C语言版)

1.2基本题1.2.1 单项选择题1.数据结构是一门研究非数值计算的程序设计问题中计算机的1 以及它们之间的2 和运算等的学科。
1、A.操作对象B.计算方法C.逻辑存储D.数据映象2、A.结构B.关系C.运算D.算法答:1、A 2、B2.数据结构被形式地定义为(K,R),其中K是1 的有限集合,R是K上的2 有限集合。
答:1、B 2、D1、A.算法 B.数据元素 C.数据操作 D.逻辑结构2、A.操作 B.映象 C.存储 D.关系3.在数据结构中,从逻辑上可以把数据结构分成。
答:CA.动态结构和静态结构B.紧凑结构和非紧凑结构C.线性结构和非线性结构D.内部结构和外部结构4.线性表的顺序存储结构是一种1 的存储结构,线性表的链式存储结构是一种2 的存储结构。
A.随机存取B.顺序存取C.索引存取D.散列存取答:1、A 2、B5.算法分析的目的是1 ,算法分析的两个主要方面是 2 。
答:1、C 2、A1、A.找出数据结构的全理性 B.研究算法中的输入和输出的关系C.分析算法的效率以求改进D.分析算法的易懂性和文档性2、A.空间复杂性和时间复杂性 B.正确性和简明性 C.可读性和文档性 D.数据复杂性和程序复杂性6.计算机算法指的是1 ,它必具备输入、输出和2 等五个特性。
1、A.计算方法 B.排序方法 C.解决问题的有限运算序列 D.调度方法2、A.可行性、可移植性和可扩充性 B.可行性、确定性和有穷性C.确定性、有穷性和稳定性D.易读性、稳定性和安全性答:1、C 2、B7.线性表的逻辑顺序与存储顺序总是一致的,这种说法。
A.正确 B.不正确答:B8.线性表若采用链式存储结构时,要求内存中可用存储单元的地址。
答:DA.必须是连续的B.部分地址必须是连续的C.一定是不连续的D.连续或不连续都可以9.在以下的叙述中,正确的是。
A.线性表的线性存储结构优于链表存储结构B.二维数组是其数据元素为线性表的线性表C.栈的操作方式是先进先出D.队列的操作方式是先进后出答:B10.每种数据结构都具备三个基本运算;插入、删除和查找,这种说法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目题程设计《数据结构》课)C语言程序实现采用():3选王(学时目题1:猴子一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m 的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
要求:m及n要求从键盘输入,存储方式采用向量及链表两种方式实现该问题求解。
//链表#include <stdio.h>#include <stdlib.h>// 链表节点typedef struct _RingNode{int pos;struct _RingNode *next;}RingNode, *RingNodePtr;// 创建约瑟夫环,pHead:链表头指针,count:链表元素个数void CreateRing(RingNodePtr pHead, int count){RingNodePtr pCurr = NULL, pPrev = NULL;int i = 1;pPrev = pHead;while(--count > 0){pCurr = (RingNodePtr)malloc(sizeof(RingNode));i++;pCurr->pos = i;pPrev->next = pCurr;pPrev = pCurr;}pCurr->next = pHead; // 构成环状链表}void KickFromRing(RingNodePtr pHead, int n){RingNodePtr pCurr, pPrev;int i = 1; // 计数pCurr = pPrev = pHead;while(pCurr != NULL){if (i == n){// 踢出环printf(\%d, pCurr->pos); // 显示出圈循序pPrev->next = pCurr->next;free(pCurr);pCurr = pPrev->next;i = 1;}pPrev = pCurr;pCurr = pCurr->next;if (pPrev == pCurr){// 最后一个printf(\King is %d, pCurr->pos); // 显示出圈循序free(pCurr);break;}i++;}}int main(){int n = 0, m = 0;RingNodePtr pHead = NULL;printf(M(person count) = );scanf(%d, &m);printf(N(out number) = );scanf(%d, &n);if(m <= 0 || n <= 0){printf(Input Error\n);return 0;}建立链表//pHead = (RingNodePtr)malloc(sizeof(RingNode));pHead->pos = 1;pHead->next = NULL;CreateRing(pHead, m);// 开始出圈printf(\Kick Order: );KickFromRing(pHead, n);printf(\);system(pause);return 0;}//数组做:#include<stdio.h>#include<stdlib.h>#include<string.h>void SelectKing(int MonkeyNum, int CallNum);void main(){int MonkeyNum;int CallNum;/* 输入猴子的个数*/printf(Monkey Num = );scanf(%d, &MonkeyNum);/* 输入M的值*/printf(Call Num = );scanf(%d, &CallNum);SelectKing(MonkeyNum, CallNum);}void SelectKing(int MonkeyNum, int CallNum){int *Monkeys; // 申请一个数组,表示所有的猴子;int counter = 0; //计数,当计数为猴子个数时表示选到最后一个猴子了;int position = 0; // 位置,数组的下标,轮流遍历数组进行报数;int token = 0; // 令牌,将报数时数到M的猴子砍掉;// 申请猴子个数大小的数组,把桌子摆上。
Monkeys = (int *)malloc(sizeof(int)* MonkeyNum);if (NULL == Monkeys){printf(So many monkeys, system error.\n);return;}// 将数组的所有内容初始化为0,被砍掉的猴子设置为1memset(Monkeys, 0, sizeof(int)*MonkeyNum);// 循环,直到选中大王while(counter != MonkeyNum){// 如果这个位置的猴子之前没有砍掉,那么报数有效if (Monkeys[position] == 0){token++; // 成功报数一个,令牌+1,继续报数直到等于M// 如果报数到M,那么将这个猴子砍去if (token == CallNum){,表示砍去1设置为Monkeys[position] = 1; //counter++; // 计数增加token = 0; // 设置为0,下次重新报数// 如果是最后一个猴子,把它的位置打印,这个就是大王了if (counter == MonkeyNum){printf(The king is the %d monkey.\n, position+1);}}}// 下一个猴子报数position = (position + 1)%MonkeyNum;}// 释放内存,开头为所有猴子创建的桌子free(Monkeys);return;})3:时学(转逆符字: 2目题.,并1个字符)从键盘读入一个字符串,把它存入一个链表(每个结点存储按相反的次序将字符串输出到显示屏。
#include <stdio.h>#include <stdlib.h>struct node{struct node *prev;char c;struct node *next;};struct node *input(struct node *top);int main(void){struct node T,*top=&T,*bottom=&T,*p=NULL; T.prev=NULL;T.next=NULL;T.c='\0';bottom=input(top);p=bottom->prev;while(p!=NULL){printf(%c,p->c);p=p->prev;}return 0;}struct node *input(struct node *top){struct node *t;char x;while((x=getchar())!='\n'){top->c=x;t=(struct node *)malloc(sizeof(struct node)); top->next=t;t->prev=top;t->next=NULL;t->c='\0';top=top->next;}return top;}题目3 :工资核算(学时:3)设有一个单位的人员工资有如下信息:name、department、 base pay、allowance、total。
现从键盘输入一组人员工资数据并将它们存储到名为paydata的文件中;再从paydata取出工资数据并给每个人的base pay增加100元,增加后将工资数据显示于屏幕(每行1人)。
#include<stdio.h>#include<stdlib.h>#define SIZE 2#define LENTH sizeof(struct stuff)struct stuff{char name[100];char department[100];int basepay;int allowance;int total;}stuff[SIZE];main(){FILE *fp;int i;printf(Please enter name department basepay allowance:\n);for(i=0;i<SIZE;i++)scanf(%s %s %f %f,&stuff[i].name,&stuff[i].department,&stuff[i].basepay,&stuff[i].allowance);if((fp=fopen(paydata.dat,wb))==NULL){printf(Can't open file\n);return 0;}for(i=0;i<SIZE;i++)if(fwrite(&stuff[i],LENTH,1,fp)!=1)牰湩晴尨文件写入出错\n);fclose(fp);if((fp=fopen(paydata.dat,b))==NULL){printf(Can't open file\n);}牰湩晴尨修改过后的结果:\n);for(i=0;i<SIZE;i++){fread(&stuff[i],LENTH,1,fp);stuff[i].total=stuff[i].basepay+100+stuff[i].allowance;printf(%-10s%-10s %f %f %f\n,stuff[i].name,stuff[i].department,stuff[i].basepay+100,stuff[i].allowance,stuff[i].total);}fclose(fp);return 0;}题目4:满足条件的有序表生成(学时:3)已知三个有序表A、B、C,它们皆由同一类元素构成,现要求对于表A作以下运算而获得有序表D:排出A中所有的既在B中又在C中出现的元素。
另外该任务要求具有建立有序表功能以及输出有序表到屏幕的功能。
#include <stdio.h>void main(){int a[7],b[5],c[6],d[7];int i,j,k,t,m;printf(\Please enter 7 numbers of A:);for(i=0;i<7;i++)scanf(%d,&a[i]);for(j=0;j<6;j++)for(i=0;i<6-j;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}printf(he sorted numbers:\n);for(i=0;i<7;i++)printf(],a[i]);printf(\Please enter 5 numbers of B:);for(i=0;i<5;i++)scanf(%d,&b[i]);printf(\);for(j=0;j<4;j++)for(i=0;i<4-j;i++)if(b[i]>b[i+1]){t=b[i];b[i]=b[i+1];b[i+1]=t;}printf(he sorted numbers:\n);for(i=0;i<5;i++)printf(],b[i]);printf(\Please enter 6 numbers of C:);for(i=0;i<6;i++)scanf(%d,&c[i]);for(j=0;j<5;j++)for(i=0;i<5-j;i++)if(c[i]>c[i+1]){t=c[i];c[i]=c[i+1];c[i+1]=t;}printf(he sorted numbers:\n);for(i=0;i<6;i++)printf(],c[i]);printf(\);for(i=0;i<5;i++){for(j=0;j<6;j++){if(b[i]==c[j]){for(k=0;k<7;k++){if(b[i]==a[k])a[k]=m;}}}}printf(\);k=0;for(i=0;i<7;i++)if(a[i]!=m){d[k]=a[i];k++;}); d 为牰湩晴尨生成的有序表for(i=0;i<k;i++)printf(M,d[i]);printf(\);}题目5:一元多项式的减法(学时:6)设有两个一元多项式A(x),B(x),请完成运算A(x)+B(x)、A(x)-B(x),要求多项式采用链表进行存储。