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

合集下载

数据结构经典题目及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语言版试题大全(含答案),推荐文档

(完整版),数据结构c语言版试题大全(含答案),推荐文档

B
16C
18、逻辑结构|顺序存储结构|链式存储结构|以上都对
B
17B
19、每个结点用占一片连续的存储区域|所有结点占用一片连续的存储区域|结点的最后一个数据域是 18B
指针类型|每个结点有多少个后继,就设多少个指针域
A
19A
20、效率与采用何种存储结构有关|是根据存储结构来定义的|有算术运算和关系运算两大类|必须用 20A
31、一个有限序列,可以为空|一个有限序列,不可以为空|一个无限序列,可以为空|一个无限序列, 37A
不可以为空
A
38B
32、必须是连续的|一定是不连续的|部分地址必须是连续的|连续与否均可以
D
39B
33、可随机访问任一结点|插入删除不需要移动元素|不必事先估计存储空间|所需空间与其长度成正 40D
-3-
35、设线性表有 n 个元素,以下操作中,_______在顺序表上实现比在链表上实现效率更高。 输出第 i(1<=i<=n)个元素值|交换第 1 个元素与第 2 个元素的值|顺序输出这 n 个元素的值|输出与给定值 x 相等的元素在线性表中的序号 36、对于一个线性表,既要求能够较快地进行插入和删除,又要求存储结构能够反映数据元素之间的逻辑 关系,则应采用_______存储结构。 顺序|链式|散列|索引 37、设线性表中有 2n 个元素,以下操作中,______在单链表上实现要比在顺序表上实现效率更高。 删除指定的元素|在最后一个元素的后面插入一个新元素|顺序输出前 k 个元素|交换第 i 个元素和第 2n-i-1 个元素的值(i=0,1,…,n-1) 38、需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是______。 单链表|静态链表|线性链表|顺序存储结构 39、如果最常用其所长的操作是取第 i 个结点及其前驱,则采用______结构方式最节省时间。 单链表|双链表|单循环链表|顺序表 40、与单链表相比,双链表的优点之一是______。 插入、删除操作更简单|可以进行随机访问|可以省略表头指针或表尾指针|访问前后相邻结点更灵活 41、数据结构在计算机内存中的表示是指______. 数据的存储结构|数据结构|数据的逻辑结构|数据元素之间的关系 42、下面程序段的时间复杂度为_________. O(m)| O(n)|O(m*n)|O(m+n)

数据结构c语言版有趣的代码

数据结构c语言版有趣的代码

数据结构c语言版有趣的代码随着计算机科学的不断发展,数据结构成为了计算机科学中必学的一门课程。

而C语言是一种广泛使用的高级编程语言,因其效率高和跨平台的特性,被广泛应用于操作系统、嵌入式系统和游戏等领域。

在本文中,我们将探讨一些数据结构C语言版的有趣代码。

1. 链表链表是一种常用的动态数据结构,由节点组成,每个节点包含一个数据元素和指向下一个节点的指针。

链表具有插入、删除等操作的高效性,因此被广泛应用于操作系统、编译器、数据库等领域。

下面是一个简单的单链表代码实现:```C#include<stdio.h>#include<stdlib.h>struct Node{int data;struct Node* next;};void printList(struct Node* head){printf("Linked list: ");while (head != NULL){printf("%d ", head->data);head = head->next;}printf("\n");}void push(struct Node** head, int newData){struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));newNode->data = newData;newNode->next = (*head);(*head) = newNode;}int main(){struct Node* head = NULL;push(&head, 1);push(&head, 2);push(&head, 3);push(&head, 4);printList(head);return 0;}```2. 树树是一种非常常用的数据结构,经常用于构建文件系统、数据库索引等。

数据结构代码题范文

数据结构代码题范文

数据结构代码题范文数据结构是计算机科学中的一个重要概念,它是用来组织和存储数据的一种方式。

在计算机中,数据可以被存储在不同的数据结构中,每一种数据结构都有各自的优点和缺点。

常见的数据结构包括数组、链表、栈、队列、树等等。

每个数据结构都有其特定的目的和用途。

在本文中,我将为大家介绍一些常见的数据结构,并且给出一些代码示例。

首先,我们来看一下数组。

数组是最简单和最常见的数据结构之一、它由一系列按顺序排列的元素组成,每个元素可以通过索引访问。

数组的优点是可以快速访问数组中的任何元素,缺点是插入和删除元素时效率较低。

```cpp#include <iostream>using namespace std;int maiint arr[5] = {1, 2, 3, 4, 5}; // 定义一个大小为5的整型数组cout << arr[0] << endl; // 输出数组第一个元素return 0;```接下来是链表。

链表是一种动态数据结构,它可以在运行时动态分配内存。

链表由节点组成,每个节点包含一个元素和一个指向下一个节点的指针。

链表的优点是插入和删除元素时效率高,缺点是访问链表中的元素相对较慢。

```cpp#include <iostream>using namespace std;//链表节点定义struct Nodeint data;struct Node* next;};int maistruct Node* head = NULL; // 定义一个空的链表头节点struct Node* second = NULL; // 定义第二个节点struct Node* third = NULL; // 定义第三个节点//为每个节点分配内存head = new Node(;second = new Node(;third = new Node(;//给每个节点赋值head->data = 1;second->data = 2;third->data = 3;//组织链表关系head->next = second;second->next = third;third->next = NULL;//遍历链表并输出每个节点的值struct Node* current = head;while (current != NULL)cout << current->data << endl;current = current->next;}return 0;```接下来是栈。

数据结构试题及答案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. 图的顶点可以是孤立的,没有边与之相连。

c语言经典题目100题

c语言经典题目100题

1.寻找数组中的最大值和最小值2.寻找数组中的中位数3.查找数组中给定元素的索引4.反转数组5.合并两个升序数组6.移位数组7.查找两个数组的交集8.查找两个数组的并集9.查找两个数组的差集10.寻找数组中的众数11.寻找数组中的缺失元素12.寻找数组中的重复元素13.计算数组的和14.计算数组的平均值15.计算数组的方差16.计算数组的标准差17.比较两个数组是否相等18.复制数组19.排序数组20.搜索数组(线性搜索)21.搜索数组(二分搜索)22.插入元素到数组23.删除元素到数组24.更新数组中的元素25.创建动态数组26.释放动态数组27.字符串复制28.字符串连接29.字符串比较30.字符串搜索31.字符串替换32.字符串分割33.字符串反转34.字符串大小写转换35.字符串修剪36.计算字符串长度37.字符串格式化38.链表创建39.链表插入40.链表删除41.链表搜索42.链表反转43.链表排序44.链表合并45.链表复制46.链表释放47.树创建48.树插入49.树删除50.树搜索51.树反转52.树排序53.树合并54.树复制55.树释放56.堆创建57.堆插入58.堆删除59.堆搜索60.堆反转61.堆排序62.堆合并63.堆复制64.堆释放65.图创建66.图插入67.图删除68.图搜索69.图反转70.图排序71.图合并72.图复制73.图释放74.队列创建75.队列插入76.队列删除77.队列搜索78.队列反转79.队列排序80.队列合并81.队列复制82.队列释放83.栈创建84.栈插入85.栈删除86.栈搜索87.栈反转88.栈排序89.栈合并90.栈复制91.栈释放92.哈希表创建93.哈希表插入94.哈希表删除95.哈希表搜索96.哈希表反转97.哈希表排序98.哈希表合并99.哈希表复制100.哈希表释放。

《数据结构》的全部代码实现C语言

《数据结构》的全部代码实现C语言

/* 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() */#include<io.h> /* eof() */#include<math.h> /* floor(),ceil(),abs() */#include<process.h> /* exit() *//* 函数结果状态代码*/#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 *//* algo2-1.c 实现算法2.1的程序*/#include"c1.h"typedef int ElemType;#include"c2-1.h"/*c2-1.h 线性表的动态分配顺序存储结构*/#define LIST_INIT_SIZE 10 /* 线性表存储空间的初始分配量*/#define LISTINCREMENT 2/* 线性表存储空间的分配增量*/typedef struct{ElemType*elem; /* 存储空间基址*/int length; /* 当前长度*/int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */}SqList;#include"bo2-1.c"/* bo2-1.c 顺序表示的线性表(存储结构由c2-1.h定义)的基本操作(12个) */ Status InitList(SqList*L) /* 算法2.3 */{ /* 操作结果:构造一个空的顺序线性表*/(*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!(*L).elem)exit(OVERFLOW); /* 存储分配失败*/(*L).length=0; /* 空表长度为0 */(*L).listsize=LIST_INIT_SIZE; /* 初始存储容量*/return OK;}Status DestroyList(SqList*L){ /* 初始条件:顺序线性表L已存在。

数据结构与C语言程序设计试题及答案

数据结构与C语言程序设计试题及答案
5.已知模式匹配的KMP算法中模式串t=’adabbadada’,其next函数的值为0112112343。
6.在置换-选择排序中,假设工作区的容量为w,若不计输入、输出的时间,则对n个记录的文件而言,生成所有初始归并段所需时间为O(n log w)。
三.简答题(6’5)
1.有n个不同的英文单词,它们的长度相等,均为m,若n>>50,m<5,试问采用什么排序方法时间复杂度最佳?为什么?
采用基数排序方法最佳。
因单词长度相等,而只有26个字母组成,符合基数排序的条件。
因m<<n,故时间复杂性由O(m(n+rm))变成O(n)。
2.对于一个栈,给出输入序列A,B,C,试给出全部可能的输出序列。若输入序列的长度为n,则可能的输出序列有多少?
ABC,ACB,BAC,BCA,CBA
C2nn/(n+1)
()10、任何有向图的顶点都可以按拓扑序排序。
二.填空题(2’6)
1.假设用于通信的电文由8个字母组成,其频率分别为0.07,0.19,0.02,0.06, 0.32,0.03,0.21,0.10,为这8个字母设计哈夫曼编码,其中编码长度最大的字母的编码是5位。
2.已知二叉树按中序遍历所得到的结点序列为DCBGEAHFIJK,按后序遍历所得到的结点序列为DCEGBFHKJIA,按先序遍历所得到的结点序列为ABCDGEIHFJK。
O(n log n)
四.程序设计题(38’)
1.假设有两个集合A和B,均以元素值递增有序排列的带头结点的单链表作为存储结构。请编写算法求C=AB,要求C按元素值递增有序排列,并要求利用原表(即表A和表B)的结点空间存放表C。(12’)
void Join(LinkList &la , LinkList &lb , LinkList &lc)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构》课程设计题目(程序实现采用C语言)题目1:猴子选王(学时:3)一堆猴子都有编号,编号是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("\n%d", pCurr->pos); // 显示出圈循序pPrev->next = pCurr->next;free(pCurr);pCurr = pPrev->next;i = 1;}pPrev = pCurr;pCurr = pCurr->next;if (pPrev == pCurr){// 最后一个printf("\nKing 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("\nKick Order: ");KickFromRing(pHead, n);printf("\n");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){Monkeys[position] = 1; // 设置为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;}题目2:字符逆转(学时:3)从键盘读入一个字符串,把它存入一个链表(每个结点存储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)printf("文件写入出错\n");fclose(fp);if((fp=fopen("paydata.dat","rb"))==NULL){printf("Can't open file\n");}printf("修改过后的结果:\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中出现的元素。

相关文档
最新文档