数据结构经典题目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)

c语言版数据结构试题及答案

c语言版数据结构试题及答案

习题一一、单选题1.在一个带有附加表头结点的单链表HL中,若要向表头插入一个由指针p指向的结点,则执行( B )。

A. HL=p; p->next=HL;B. p->next=HL->next; HL->next=p;C. p->next=HL; p=HL;D. p->next=HL; HL=p;2.若顺序存储的循环队列的QueueMaxSize=n,则该队列最多可存储( B )个元素.A. nB.n-1C. n+1D.不确定3.下述哪一条是顺序存储方式的优点?(A )A.存储密度大 B.插入和删除运算方便C. 获取符合某种条件的元素方便D.查找运算速度快4.设有一个二维数组A[m][n],假设A[0][0]存放位置在600(10),A[3][3]存放位置在678(10),每个元素占一个空间,问A[2][3](10)存放在什么位置?(脚注(10)表示用10进制表示,m>3)DA.658 B.648 C.633 D.6535.下列关于二叉树遍历的叙述中,正确的是( AD ) 。

A. 若一个树叶是某二叉树的中序遍历的最后一个结点,则它必是该二叉树的前序遍历最后一个结点B.若一个点是某二叉树的前序遍历最后一个结点,则它必是该二叉树的中序遍历的最后一个结点 C.若一个结点是某二叉树的中序遍历的最后一个结点,则它必是该二叉树的前序最后一个结点D.若一个树叶是某二叉树的前序最后一个结点,则它必是该二叉树的中序遍历最后一个结点6.k层二叉树的结点总数最多为( A ).A.2k-1 B.2K+1 C.2K-1 D. 2k-17.对线性表进行二分法查找,其前提条件是( B ).A.线性表以链接方式存储,并且按关键码值排好序B.线性表以顺序方式存储,并且按关键码值的检索频率排好序C.线性表以顺序方式存储,并且按关键码值排好序D.线性表以链接方式存储,并且按关键码值的检索频率排好序8.对n个记录进行堆排序,所需要的辅助存储空为Cn) B. O(n) C. O(1) D. O(n2)A. O(1og29.对于线性表(7,34,77,25,64,49,20,14)进行散列存储时,若选用H(K)=K %7作为散列函数,则散列地址为0的元素有( D )个,A.1 B.2 C.3 D.410.下列关于数据结构的叙述中,正确的是( D ).A.数组是不同类型值的集合B.递归算法的程序结构比迭代算法的程序结构更为精炼C.树是一种线性结构D.用一维数组存储一棵完全二叉树是有效的存储方法二、填空题1.数据的逻辑结构被分为_集合结构、__线性结构、_树结构和_图结构四种。

数组c语言试题库及答案

数组c语言试题库及答案

数组c语言试题库及答案1. 请解释C语言中数组的概念。

答:在C语言中,数组是一种数据结构,它允许将多个相同类型的数据项存储在连续的内存位置。

数组可以是一维的,也可以是多维的。

2. 如何声明一个整型数组?答:声明一个整型数组的语法是 `int array_name[size];`,其中`array_name` 是数组的名字,`size` 是数组中元素的数量。

3. 请写出一个程序,用于计算一个整型数组中所有元素的和。

```c#include <stdio.h>int main() {int array[] = {1, 2, 3, 4, 5};int sum = 0;for(int i = 0; i < 5; i++) {sum += array[i];}printf("Sum of array elements: %d\n", sum);return 0;}```4. 如果一个数组的元素数量是动态的,应该如何声明?答:在C语言中,可以使用指针来处理动态数组。

声明方式为`int *array_name;`,然后在程序中使用 `malloc` 或 `calloc` 函数分配内存。

5. 请解释数组的索引。

答:数组的索引是从0开始的,它表示数组中元素的位置。

例如,对于一个名为 `array` 的数组,`array[0]` 是数组的第一个元素。

6. 如何初始化一个整型数组?答:可以使用花括号 `{}` 来初始化数组,例如 `int array[] = {1, 2, 3, 4, 5};`。

7. 请写出一个程序,用于交换数组中的两个元素。

```c#include <stdio.h>int main() {int array[] = {1, 2, 3, 4, 5};int temp;int index1 = 1; // 第二个元素int index2 = 3; // 第四个元素temp = array[index1];array[index1] = array[index2];array[index2] = temp;for(int i = 0; i < 5; i++) {printf("%d ", array[i]);}return 0;}```8. 在C语言中,数组的元素可以是什么数据类型?答:数组的元素可以是任何数据类型,包括整型、浮点型、字符型、结构体等。

c语言编程题经典100例

c语言编程题经典100例

c语言编程题经典100例在计算机编程中,C语言是一种非常流行和常用的编程语言。

掌握C语言的编程技巧对于计算机科学和软件开发的学习者来说至关重要。

本文将介绍C语言编程中的100个经典例题,帮助读者提高他们的编程技巧和解决问题的能力。

1. 计算并输出1到100之间所有偶数的和。

```c#include<stdio.h>int main() {int sum = 0;for(int i = 0; i <= 100; i+=2) {sum += i;}printf("1到100之间所有偶数的和为:%d\n", sum);return 0;}```2. 输入一个整数,判断是否是质数。

```c#include<stdio.h>#include<stdbool.h>bool is_prime(int num) {if(num <= 1) {return false;}for(int i = 2; i <= num / 2; ++i) { if(num % i == 0) {return false;}}return true;}int main() {int num;printf("请输入一个整数: ");scanf("%d", &num);if(is_prime(num)) {printf("%d是质数\n", num);printf("%d不是质数\n", num);}return 0;}```3. 编写一个函数,接受3个整数参数,返回其中最大的一个数。

```c#include<stdio.h>int max_of_three(int a, int b, int c) {int max = a;if(b > max) {max = b;}if(c > max) {max = c;}return max;}int a, b, c;printf("请输入三个整数: ");scanf("%d%d%d", &a, &b, &c);int max = max_of_three(a, b, c);printf("最大的数是: %d\n", max); return 0;}```4. 使用递归函数计算斐波那契数列。

数据结构代码C语言版

数据结构代码C语言版

2.2.3 顺序表的应用举例#define MAX 100/*定义表长不超过100*/typedef struct node{int data[MAX];int lenth;} LIST; /*lenth变量存放的是表的实际长度,表中的元素存在数组data中,并且从下标1的单元开始存放。

*/#include <stdio.h>void merge_list(LIST la,LIST lb ,LIST *lc)/*两个有序表合并*/{int i,j,k;i=j=k=1;while(i<=la.lenth&&j<=lb.lenth)if(la.data[i]<=lb.data[j]){lc->data[k]=la.data[i];k++;i++;}else{lc->data[k]=lb.data[j];k++;j++;}while(i<=la.lenth){lc->data[k]=la.data[i];k++;i++;}while(j<=lb.lenth){lc->data[k]=lb.data[j];k++;j++;}lc->lenth=k-1;return;}Void main(){LIST la,lb,lc;int i,k,m;printf("请输入la顺序表元素,元素为整型量,用空格分开,-99为结束标志:");la.lenth=0;scanf("%d",&i);while(i!=-99)/*输入la顺序表元素,建立有序表*/{k=la.lenth;while ((k>=1)&&(i<la.data[k]))k--;for(m=la.lenth;m>=k+1;m--) la.data[m+1]=la.data[m];la.data[k+1]=i;la.lenth++;scanf("%d",&i);}printf("\n\n请输入lb顺序表元素,元素为整型量,用空格分开,-99为结束标志:");lb.lenth=0;scanf("%d",&i);while(i!=-99)/*输入lb顺序表元素,建立有序表*/{k=lb.lenth;while ((k>=1)&&(i<lb.data[k]))k--;for(m=lb.lenth;m>=k+1;m--) lb.data[m+1]=lb.data[m];lb.data[k+1]=i;lb.lenth++;scanf("%d",&i);}printf("\nla有序表元素列表:");for(i=1;i<=la.lenth;i++)printf("%4d",la.data[i]);printf("\n");printf("\nlb有序表元素列表:");for(i=1;i<=lb.lenth;i++)printf("%4d",lb.data[i]);printf("\n");merge_list(la,lb,&lc);printf("\nlc有序表元素列表:");for(i=1;i<=lc.lenth;i++)printf("%4d",lc.data[i]);printf("\n");}2.3.5 单链表应用举例#include <stdio.h>#include <stdlib.h>typedef struct pnode{int coef; /*系数以整型为例*/int exp; /*指数*/struct pnode*next;/*指针*/}PNODE;PNODE *creat_link(int n){ /*顺序输入n个元素的值,建立带表头结点的单链表*/PNODE *head,*p,*s;int i;head=(PNODE *)malloc(sizeof(PNODE));/*head为表头指针*/head->next=NULL; /*先建立一个带表头结点的空表*/p=head;printf("enter coef,exp:\n");for(i=1;i<=n;i++){s=(PNODE *)malloc(sizeof(PNODE)); /*生成新结点*/scanf("%d,%d",&s->coef,&s->exp); /*输入结点的系数和指数*/s->next=NULL;p->next=s;p=s; /*新结点插入表尾*/}return(head);}void padd(PNODE *pa,PNODE *pb){ /*以pa和pb为头指针的单链表分别表示两个多项式,实现pa=pa+pb */ PNODE *pre,*qa,*q,*qb;int sum;pre=pa; /*pre始终指向当前和多项式的最后一个结点*/qa=pa->next;qb=pb->next; /*qa、qb分别指向pa、pb中的当前结点*/ while (qa&&qb){/*qa、qb均非空*/if(qa->exp==qb->exp){/*指数相同*/sum=qa->coef+qb->coef;if(sum) {qa->coef=sum;pre=qa;}else {pre->next=qa->next;free(qa);}qa=pre->next;q=qb;qb=qb->next;free(q);}else{/*指数不相同*/if(qa->exp>qb->exp){pre=qa;qa=qa->next;}else{pre->next=qb;pre=qb;qb=qb->next;pre->next=qa;}}}if(qb)pre->next=qb; /*链接pb 中剩余结点*/free(pb);}void print_link(PNODE *h){PNODE *p;p=h->next;while(p->next){printf("%d^%d+",p->coef,p->exp);p=p->next;}if(p->exp)printf("%d^%d\n",p->coef,p->exp);else printf("%d\n",p->coef);}void main(){PNODE *ha,*hb; /*多项式链表的头指针*/int la,lb;scanf("%d,%d",&la,&lb); /*输入多项式A和B的项数*/ha=creat_link(la);print_link(ha);hb=creat_link(lb);print_link(hb);padd(ha,hb);print_link(ha);}实训1参考程序#include <stdlib.h>#include <alloc.h> //改成 #include <ostream.h>typedef struct node{int number; /* 人的序号 */int cipher; /* 密码 */struct node *next; /* 指向下一个结点的指针 */}NODE;NODE *CreatList(int num) /* 建立循环链表 */{int i;NODE *ptr1,*head;if((ptr1=(NODE *)malloc(sizeof(NODE)))==NULL){perror("malloc");return ptr1;}head=ptr1;ptr1->next=head;for(i=1;i<num;i++){if((ptr1->next=(NODE *)malloc(sizeof(NODE)))==NULL) {perror("malloc");ptr1->next=head;return head;}ptr1=ptr1->next;ptr1->next=head;}return head;}void main(){int i,n=30,m; /* 人数n为30个 */NODE*head,*ptr;int randomize();head=CreatList(n);for(i=1;i<=30;i++){head->number=i;head->cipher=rand();head=head->next;}m=rand(); /* m取随机数 */i=0;while(head->next!=head) /* 当剩下最后一个人时,退出循环 */{if(i==m){ptr=head->next; /* ptr记录数到m的那个人的位置 */printf("number:%d\n",ptr->number);printf("cipher:%d\n",ptr->cipher);m=ptr->cipher; /* 让m等于数到m的人的密码 */head->next=ptr->next; /* 让ptr从链表中脱节,将前后两个结点连接起来 */ head=head->next; /* head移向后一个结点 */free(ptr); /* 释放ptr指向的内存 */i=0; /* 将i重新置为0,从0再开始数 */}else{head=head->next;i++;}}printf("number:%d\n",head->number);printf("cipher:%d\n",head->cipher);free(head); /* 让最后一个人也出列 */}3.1.2 栈的顺序存储及其基本操作的实现2.进栈#include <stdio.h>#define MAX 10int s[MAX]; /*定义数组t,用来存储栈的元素,以整数为例*/int top; /*定义栈顶指针为top*/int push(int s[],int x){/*x为要插入的新元素*/if(top==MAX){printf("stack overflow\n"); /*栈满信息*/return(0);}else{s[top]=x; /*数据入栈*/top=top+1; /*当栈不满时,栈顶加1*/printf("ok\n");return(1);}}void main() /*主程序*/{int a[MAX]={1,2,3,4,5};int x=56,i;top=5;if(push(a,x))for(i=0;i<top;i++)printf("%3d",a[i]); /*函数调用*/}例如栈为{1,2,3,4,5},想让元素“56”进栈,调用进栈函数后,栈的内容成为{1,2,3,4,5,56}。

《数据结构(C语言描述)》-马秋菊-源代码和习题参考答案

《数据结构(C语言描述)》-马秋菊-源代码和习题参考答案

习题配套第一章2.C、A、B、B、A、A、D3.D={A,B,C,E,F,G,H,I,J};R={<A,B>,<A,C>,<A,E>,<B,F>,<B,G>,<E,H>,<E,I>,<E,J>,<H,I>,<I,J>}题1-3图4.顺序、链式、索引、哈希。

*5.解:100n2>2n n至少要多大6.O(n)、O(n)、O(n)、O(n)、(5)当n>m,O(n),当m>n,O(m)7.n!2100>lgn>n1/2>n3/2>(3/2)n>2n>n lgn>n n第二章1.×、√、×、√、√2.AAD4.顺序表void Delete_SeqListx(SeqList *L,ElemType x)/*删除表中值为x元素*/{inti,j;for(i=1;i<=L->length;i++){if(L->elem[i]==x){for(j=i;j<=L->length-1;j++)L->elem[j]=L->elem[j+1];L->length--;}/*向上移动*/}O(n2)链表void del_link(LinkList H,int x)/*删除数据域为x的结点*/ {LNode *p,*q;p=H;q=H->next;while(q!=NULL){if(q->data==x){p->next=q->next;free(q);q=p->next;}else{p=q;q=q->next;}}}O(n)5.int Delete_SeqListx(SeqList *L,int i,int k)/*删除表中删除自第i个结点开始的k个结点*/{intj;if(i<1||k<0||i+k-1>L->length)/*检查空表及删除位置的合法性*/{printf("不存在第i个元素");return ERROR;}for(j=i;j<=L->length-k;j++)L->elem[j]=L->elem[j+k]; /*向上移动*/L->length-=k;Return OK;/*删除成功*/}O(n)6.void Delete_SeqListx(SeqList *L,ElemType x)/*将表中值为x元素换成y*/{inti,j;for(i=1;i<=L->length;i++){if(L->elem[]==x){L->elem[i]=y;}/* */}O(n)7.写一算法在循环单链表上实现线性表的CList_length(L)运算。

(完整word版)数据结构(c语言版)课后习题答案完整版资料

(完整word版)数据结构(c语言版)课后习题答案完整版资料

第1章绪论5.选择题:CCBDCA6.试分析下面各程序段的时间复杂度。

(1)O(1)(2)O(m*n)(3)O(n2)(4)O(log3n)(5)因为x++共执行了n—1+n—2+……+1= n(n—1)/2,所以执行时间为O(n2)(6)O(n)第2章线性表1.选择题babadbcabdcddac2.算法设计题(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。

ElemType Max (LinkList L ){if(L—〉next==NULL) return NULL;pmax=L-〉next;//假定第一个结点中数据具有最大值p=L-〉next—>next;while(p != NULL ){//如果下一个结点存在if(p->data > pmax—>data) pmax=p;p=p->next;}return pmax-〉data;(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间.void inverse(LinkList &L) {// 逆置带头结点的单链表Lp=L-〉next;L->next=NULL;while (p){q=p—>next;// q指向*p的后继p->next=L—>next;L—>next=p; // *p插入在头结点之后p = q;}}(10)已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为item的数据元素.[题目分析]在顺序存储的线性表上删除元素,通常要涉及到一系列元素的移动(删第i个元素,第i+1至第n个元素要依次前移)。

本题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。

因此可以考虑设头尾两个指针(i=1,j=n),从两端向中间移动,凡遇到值item的数据元素时,直接将右端元素左移至值为item的数据元素位置。

数据结构c语言版(题目)

数据结构c语言版(题目)

分类:编程思想和算法2012-09-15 22:24 1759 人阅读评论(0)收藏举报如果TCPhashlistJuli 采用线性表的顺序存储结构,则可以随机存取表中任一终端,但插入和删除终端时,需要移动大量元素,巧妙地终端离线不进行删除操作。

数组,存储的元素应该是线性表顺序存储结构的数据结构。

线性表题目类型:线性表在顺序结构上各种操作的实现;线性链表的各种操作;两个或多个线性表的各种操作;循环链表和双向链表;稀疏多项式及其运算在线性表的两种存储结构上的实现。

线性表在顺序结构上各种操作的实现题目1:(线性表顺序存储结构上的操作—Delete )从顺序存储结构的线性表a 中删除第i个元素起的k个元素。

(《数据结构题集C语言版》P16)题目2:(线性表顺序存储结构上的操作_lnsert )设顺序表va中的数据元素递增有序。

试写一算法,将x插入到循序表的适当位置上,以保持该表的有序性。

(《数据结构题集C语言版》P17)题目3:(线性表顺序存储结构上的操作_逆置)试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表逆置。

(《数据结构题集C语言版》2.21)线性表线性链表的各种操作题目1:( Insert )试写一算法,在无头结点的动态单链表上实现线性表的Insert(L,i,b), 并和在带头结点的动态单链表上实现同样操作的算法进行比较。

(《数据结构题集C语音版》P17)题目2:(Delete )同上题要求,实现线性表操作Delete(L,i).题目3:已知线性表中的元素以值递增有序排序,并以单链表作为存储结构。

试写一高效算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素)同时释放被删除结点空间,并分析你的算法的事件复杂度(注意:mink和maxk是给定的两个参变量,它们的值可以和表中的元素相同,也可以不同)。

(《数据结构题集C语言版》P17)题目4:同上题条件,试写一高效算法,删除表中所有值相同的多余元素(使得操作后的线性表所有元素的值均不相同),同是释放被删结点空间,并分析你算法的时间复杂度。

(完整版)数据结构经典题目及c语言代码

(完整版)数据结构经典题目及c语言代码

《数据结构》课程设计题目(程序实现采用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。

c语言二叉树的算法代码

c语言二叉树的算法代码

c语言二叉树的算法代码C语言二叉树的算法代码二叉树是一种常用的数据结构,它由节点组成,每个节点最多有两个子节点:左子节点和右子节点。

在C语言中,我们可以使用指针来表示二叉树的节点,并通过指针的操作来实现对二叉树的插入、删除、查找等操作。

我们需要定义一个二叉树节点的结构体,它包含一个数据域和两个指针域,分别指向左子节点和右子节点。

代码如下:```cstruct TreeNode {int data; // 数据域struct TreeNode* left; // 左子节点指针struct TreeNode* right; // 右子节点指针};```接下来,我们可以实现二叉树的插入操作。

插入操作的主要思路是,首先确定要插入的节点位置,然后创建一个新节点,并将其链接到正确的位置上。

代码如下:```cstruct TreeNode* insertNode(struct TreeNode* root, intvalue) {if (root == NULL) {// 如果树为空,则创建一个新节点并返回struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));newNode->data = value;newNode->left = NULL;newNode->right = NULL;return newNode;}if (value < root->data) {// 如果要插入的值小于当前节点的值,则递归地插入到左子树中root->left = insertNode(root->left, value);} else {// 如果要插入的值大于等于当前节点的值,则递归地插入到右子树中root->right = insertNode(root->right, value);}return root;}除了插入操作,我们还可以实现二叉树的查找操作。

数据结构耿国华c语言版答案

数据结构耿国华c语言版答案

数据结构耿国华c 语言版答案【篇一:《数据结构——c语言描述》习题及答案耿国华 2】题一、问答题1.什么是数据结构?2.四类基本数据结构的名称与含义。

3.算法的定义与特性。

4.算法的时间复杂度。

5.数据类型的概念。

6.线性结构与非线性结构的差别。

7.面向对象程序设计语言的特点。

8.在面向对象程序设计中,类的作用是什么?9.参数传递的主要方式及特点。

10.抽象数据类型的概念。

二、判断题1.线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。

2.算法就是程序。

3.在高级语言(如 c、或 pascal )中,指针类型是原子类型。

三、计算下列程序段中x=x+1 的语句频度for(i=1;i=n;i++)for(j=1;j=i;j++)for(k=1;k=j;k++)x=x+1;[提示 ]:⋯f(n) = [ (1+2+3+⋯⋯+n) + (12 + 22 + 32 +⋯⋯+ n2 ) ] / 2=[ (1+n)n/2 + n(n+1)(2n+1)/6 ] / 2=n(n+1)(n+2)/6=n3/6+n2/2+n/3区分语句频度和算法复杂度:o(f(n)) = o(n3)四、试编写算法求一元多项式pn(x)=a0+a1x+a2x2+a3x3+ ⋯anxn的值 pn(x0) ,并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能的小,规定算法中不能使用求幂函数。

注意:本题中的输入 ai(i=0,1, ⋯,n), x和 n,输出为 pn(x0). 通常算法的输入和输出可采用下列两种方式之一:(1)通过参数表中的参数显式传递;(2)通过全局变量隐式传递。

试讨论这两种方法的优缺点,并在本题算法中以你认为较好的一种方式实现输入和输出。

[提示 ]: float polyvalue(float{ ⋯⋯}核心语句:p=1; (x的零次幂)s=0;i 从 0 到 n 循环s=s+a[i]*p;p=p*x;或:p=x; (x的一次幂)s=a[0];i 从 1 到 n 循环s=s+a[i]*p;p=p*x;a[ ], float x, int n)实习题设计实现抽象数据类型“有理数”。

c语言编程题经典100例

c语言编程题经典100例

c语言编程题经典100例下面是经典的c语言编程题100例,每道题目都涵盖了c语言编程的各个方面,包括基本数据类型、条件语句、循环结构、函数与指针等。

通过这100道题目的练习,可以帮助初学者快速掌握c语言编程的基础知识,也有助于进一步深入了解c语言的高级特性。

1. 打印Hello World。

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. 输入一个表达式,求它的值。

  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中出现的元素。

相关文档
最新文档