C语言单链表实现FCFS算法,数据结构(双语)-中国大学mooc-题库零氪

本课程详细讲解了数据结构中的线性表,包括顺序存储和链式存储结构,以及相关操作如插入、删除、遍历等。涉及顺序表、单链表、循环链表、双向链表的特性和操作,同时对比了顺序表与链表的优缺点。此外,还介绍了栈的定义、实现和应用场景,如括号匹配和递归。
摘要由CSDN通过智能技术生成

第一章 绪论(总时长:56分26秒,共6讲)

第1讲 数据结构的基础概念(总时长12分钟)随堂测验

1、一个抽象类型包括数据对象、 和一组处理数据的操作。

A、数据对象中各元素间的结构关系

B、数据元素集

C、接口

D、数据对象集

2、抽象数据类型具有 、信息隐蔽的特点。

第2讲 数据结构的内容(总时长5分29秒)随堂测验

1、线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。( )

2、1、数据结构的逻辑结构分为集合、线性、层次和 四种。

3、2、数据结构的存储结构分为 和非顺序 两种。

4、3、在线性结构、树形结构和图结构中,数据元素之间分别存在着一对一、一对多和 联系。

第3讲 数据结构与c语言表示(总时长7分32秒)随堂测验

1、当需要用一个形式参数直接改变对应实参的值时,该形式参数应说明为 。

A、与实参同类型指针参数

B、不需要参数

C、与实参同类型的参数

D、全局变量

第4讲 算法性能评价(总时长8分06秒)随堂测验

1、1、执行下面的程序段的时间复杂度为 。 for(int i=0;i

A、O(

112320.html)

B、O(

112320.html)

C、O(m*n)

D、O (m+n)

2、2、执行下面程序段时,语句S的执行次数为 。 for(int i=0;i<=n;i++) for(int j=0;j

A、

112320.html

B、

112320.html

C、n(n+1)

D、

112320.html

第5讲 算法与算法的描述(总时长14分59秒)随堂测验

1、算法设计的要求是:正确性、可读性 、 和高效率和低存储 。

A、确定性

B、健壮性

C、可行性

D、有限性

2、算法具有 有限性、确定性、 、输入、输出五大特性。

A、可行性

B、可读性

C、健壮性

D、正确性

第二章 线性表(一)(总时长:72分22秒,共6讲)

第1讲 线性表的概念(总时长9分20秒)随堂测验

1、线性表是具有n个( )的有限序列(n>0)

A、数据对象

B、数据元素

C、字符

D、数据项

2、线性表是一个( )。

A、有限序列,可以为空

B、有限序列,不可以为空

C、无限序列,可以为空

D、无限序列,可以为空

3、线性表的特点是每个元素都有一个前驱和一个后继。()

第2讲 线性表的顺序存储(总时长13分)随堂测验

1、若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为( )(1<=i<=n+1)。

A、O(1)

B、O(n)

C、O(n*n)

D、O(

112320.html)

2、若长度为n的线性表采用顺序存储结构,删除第i个位置的元素,需要移动的元素个数为( )。

A、i

B、n-i

C、n-i+1

D、n-i-1

第3讲 线性表顺序结构应用示例及小结(总时长7分57秒)随堂测验

1、对一个长度为n的顺序表,假设在任何位置上插入一个元素的概率是相等的,那么插入一个元素时要移动表中的( )个元素。

A、n

B、n+1

C、

112320.html

D、

112320.html

2、线性表的顺序存储是指将表中元素按照从大到小或从小到大存储。

第4讲 线性表的链式存储(总时长10分20秒)随堂测验

1、通过表达式 可以获取带头结点的单链表L中首元素结点的数据值。

A、L->next

B、(L->next)->data

C、L->data

D、L->next

2、单链表中必须设有头结点。()

第5讲 单链表的基本运算(总时长20分58秒)随堂测验

1、下列选项中, 项是链表不具有的特点。

A、插入和删除运算不需要移动元素

B、所需要的存储空间与线性表的长度成正比

C、不必事先估计存储空间大小

D、可以随机访问表中的任意元素

2、有一个带头结点的单链表HEAD,则判断其是否为空链表的表达式是

A、HEAD= =NULL

B、HEAD-〉NEXT= =NULL

C、HEAD-〉NEXT= =HEAD

D、HEAD!=NULL

3、在一个单链表中P所指结点后插入一个S所指结点时, 应执行语句: 。

A、P->next=S;S->next=P->next;

B、S->next=P->next;P->next=S;

C、S->next=P->next;P=S;

D、S->next=P;P->next=S;

第6讲 单链表运算的应用示例及小结(总时长10分47秒)随堂测验

1、设指针变量p指向单链表中结点A的直接前驱,若删除单链表中结点A,则需要修改指针的操作序列为( )。

A、q=p->next;p->next=q->next;free(q);

B、q=p->next; p->next=q->next;

C、p->next=p-> next->next;

D、q=p->next;p->data=q->data;free(q);

2、对链表进行插入和删除操作时不必移动链表中结点。( )

3、在单链表中,可以从头结点出发,查找到表中所有结点。( )

第二章 线性表(二)(总时长:59分37秒)

第7讲 循环链表(总时长7分05秒)随堂测验

1、有一个带头结点的循环单链表HEAD,则判断其是否为空链表的条件是 。

A、HEAD==NULL

B、HEAD-〉NEXT==NULL

C、HEAD-〉NEXT==HEAD

D、HEAD!=NULL

2、在单向循环链表中,从表中任意结点出发都可以顺着next域访问到表中所有元素()

第8讲 双向链表(总时长7分47秒)随堂测验

1、与单链表相比,双向链表的优点之一是 。

A、插入删除操作更加方便

B、可以进行随机访问

C、可以省略表头指针和表尾指针

D、访问前后相邻结点更方便。

2、在双向链表L中,可以从任一结点p出发沿同一方向的指针域查找到表中所有元素。()

第9讲 静态链表(总时长6分24秒)随堂测验

1、静态链表中与动态链表的插入和删除运算类似,不需要做元素的移动。()

2、静态链表既有顺序存储结构的优点,又有动态链表的优点。所以,它存取表中第i个元素的时间与位置序号i无关,可以实现随机存取。()

第10讲 链式结构小结(总时长7分32)随堂测验

1、已知单链表的头指针为head且该链表不带头结点,则该单链表为空的条件是 。

A、head== NULL

B、head->next==NULL

C、head->next==head

D、head!=NULL

2、设指针变量p指向单链表中某结点的直接前驱,若删除单链表中该结点,需要修改指针的操作序列为 。

A、q=p->next; p->next=q->next;free(q);

B、q=p->next; free(q);

C、p->next=p->next->next;free(p->next);

D、q=p->next; free(q);

3、设带有头结点的单向循环链表的头指针变量为head,则其判空条件是 。

A、head==NULL

B、head->next==NULL

C、head->next==head

D、head!=NULL

4、在双向循环链表中,可以从任一结点p出发沿同一方向的指针域查找到表中所有元素。()

第12讲 顺序表与链表的综合比较(总时长6分08秒)随堂测验

1、下列选项中, 项是链表不具有的特点。

A、插入和删除运算不需要移动元素

B、所需要的存储空间与线性表的长度成正比

C、不必事先估计存储空间大小

D、可以随机访问表中的任意元素

2、在线性表中最常用的操作是存取第i个元素及其前趋的值,可采用 存储方式最省时间?

A、顺序表

B、带头指针的双向循环链表

C、带头指针的单向循环链表

D、带头指针的单向链表

3、下面关于线性表的叙述错误的是( )。

A、线性表采用顺序存储必须占用一片连续的存储空间

B、线性表采用链式存储不必占用一片连续的存储空间

C、线性表采用链式存储便于插入和删除操作的实现

D、线性表采用顺序存储便于插入和删除操作的实现

总结与提高(总时长15分15秒)随堂测验

1、某线性表中最常用的操作是存取序号为i的元素和在最后进行插入和删除运算,则采用 存储方式时间性能最好。

A、双向链表

B、双向循环链表

C、单向循环链表

D、顺序表

2、已知一个带头结点的非空循环单链表,其尾指针是R,则其首元素结点的地址为:

A、R->next

B、*( R->next->next )

C、&( R->next->next )

D、R->next->next

3、线性表的顺序存储优于链式存储结构。()

4、在带头结点的非空单链表中,头结点的存储位置由 指示

第三章 栈与队列(一)(总时长53分23秒)

第1讲 栈的定义与实现(总时长6分59秒)随堂测验

1、栈操作的特性是( )

A、FIFO

B、LIFO

C、FCFS

D、插入和删除操作限制在表的两端进行

2、栈中,允许进行插入和删除的一端称为()

A、栈顶

B、栈底

C、栈头

D、栈尾

3、栈是线性结构,是操作受限制的线性表。()

第2讲 栈的顺序结构(总时长10分54秒)随堂测验

1、1、 已知顺序栈的地址为s,此时栈不满且栈顶指示器top指向真实栈顶,执行元素x进栈操作正确的语句是( )

A、s->top++;s->elem[s->top]=x;

B、s->top= s->top+1;s->elem[s->top]=x;

C、s->elem[++s->top]=x;

D、s->elem[s->top]=x;s->top++;

2、2、 已知顺序栈的地址为s ,此时栈不空且栈顶指示器top指向真实栈顶,执行出栈操作并将出栈元素赋值给x所指向的单元,则下列语句中,正确的是( )

A、s->top--; *x= s->elem[s->top];

B、*x= s->elem[s->top]; s->top= s->top-1;

C、*x =s->elem[s->top--];

D、*x= s->elem[s->top];s->top--;

3、1、 已知顺序栈的地址为s ,此时栈不空且栈顶指示器top指向真实栈顶,执行取栈顶操作的语句是 *x= s->elem[s->top--];( )

第3讲 顺序栈的两栈共享(总时长13分19秒)随堂测验

1、已知一个双端栈的地址为dS,则该双端栈不满时,,元素x进1号栈(高端栈)操作的语句是()

A、dS->stack[--dS->top[1]]=x;

B、dS->stack[dS->top[1]]=x;dS->top[1]--;

C、dS->top[1]--; dS->stack[dS->top[1]]=x;

D、dS->stack[++dS->top[1]]=x;

2、已知一个双端栈dStack ,则判断该双端栈栈满的条件是()

A、dStack.top[0]+1= = dStack.top[1]

B、dStack.top[0] = = dStack.top[1]

C、dStack.top[0]-1= = dStack.top[1]

D、dStack.top[0] = = dStack.top[1]-1

3、已知一个双端栈的地址为dS,则该双端栈不空时,1号栈(高端栈)出栈操作的语句是*x= dS->stack[dS->top[1]--]()

第4讲 栈的链式实现(总时长8分01秒)随堂测验

1、已知带头结点的链栈top, 则该链栈不空时, 出栈操作的语句是( )

A、top->next=top->next->next; *x=top->next->data;

B、*x=top->next->data; top->next=top->next->next; free(top->next);

C、*x=top ->data;p=top;top =p->next;free(p);

D、*x=top->next->data;p=top->next; top->next=p->next;free(p);

2、已知带头结点的链栈top, 则该链栈为空的条件是( )

A、top==NULL

B、top->next= =NULL

C、top->next->next= =NULL

D、top->next= =top

3、已知带头结点的链栈top, 则元素x对应的新结点s进栈操作的语句是()

A、s->next=top->next;top->next=s;

B、top->next=s; s->next=top->next;

C、s->next=top;top =s;

D、top =s; s->next=top;

第5讲 栈的应用(总时长8分34秒)随堂测验

1、在括号匹配算法中,当正扫描检测的符号是右括号,此时的栈是空栈,则()。

A、右括号进栈;

B、继续向下扫描;

C、取出栈顶元素做匹配检查;

D、此时出现“右括号多了”的不匹配现象。

2、在算术表达式求值的算法中,若当前正扫描的符号是运算符s,且s的优先级比运算符栈栈顶元素的优先级高,则( )

A、运算符栈出栈,运算数出栈,做运算;

B、s 进运算符栈;

C、取运算符栈栈顶,运算数栈顶,做运算;

D、s 进运算数栈;

3、在括号匹配算法中,当正扫描的符号是左括号时,则该做左括号( )。

第6讲 栈与递归(上)(总时长10分43秒)随堂测验

1、递归进层(i→i +1层)系统需要做三件事是( )

A、保留本层参数与返回地址;

B、保留下层参数和函数地址;

C、为被调用函数的局部变量分配存储区,给下层参数赋值;

D、将程序转移到被调函数的入口。

2、从被调用函数返回调用函数之前,递归退层(i←i +1层)系统也应完成三件工作是( )

A、保存被调函数的计算结果;

B、释放被调函数的数据区,恢复上层参数;

C、保存返回上层函数的地址;

D、依照被调函数保存的返回地址,将控制转移回调用函数。

3、递归是指在定义自身的同时又出现了对自身的引用。( )

4、系统需设立一个递归工作栈作为整个递归函数运行期间使用的数据存储区。每层递归所需信息构成一个( )。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用C语言实现FCFS调度算法的示例代码: ```c #include<stdio.h> struct Process { int pid; // 进程ID int burst_time; // 执行时间 int arrival_time; // 到达时间 int waiting_time; // 等待时间 int turnaround_time; // 周转时间 }; void findWaitingTime(struct Process proc[], int n) { int i, total_time, prev_time; total_time = prev_time = 0; for (i = 0; i < n; i++) { // 计算等待时间 = 上一个进程的执行时间 + 上一个进程的等待时间 - 当前进程到达时间 proc[i].waiting_time = prev_time + proc[i].waiting_time - proc[i].arrival_time; // 更新上一个进程的执行时间 prev_time += proc[i].burst_time; // 计算总时间 total_time += proc[i].waiting_time; } printf("平均等待时间 = %f\n", (float)total_time / (float)n); } void findTurnAroundTime(struct Process proc[], int n) { int i, total_time; total_time = 0; for (i = 0; i < n; i++) { // 计算周转时间 = 执行时间 + 等待时间 proc[i].turnaround_time = proc[i].burst_time + proc[i].waiting_time; // 计算总时间 total_time += proc[i].turnaround_time; } printf("平均周转时间 = %f\n", (float)total_time / (float)n); } void findAvgTime(struct Process proc[], int n) { findWaitingTime(proc, n); findTurnAroundTime(proc, n); } void sortArrivalTime(struct Process proc[], int n) { int i, j; struct Process temp; // 使用冒泡排序按到达时间排序 for (i = 0; i < n - 1; i++) { for (j = i + 1; j < n; j++) { if (proc[i].arrival_time > proc[j].arrival_time) { temp = proc[i]; proc[i] = proc[j]; proc[j] = temp; } } } } int main() { int i, n; printf("请输入进程数量:"); scanf("%d", &n); struct Process proc[n]; // 输入进程信息 for (i = 0; i < n; i++) { printf("请输入进程 %d 的执行时间和到达时间:", i + 1); scanf("%d %d", &proc[i].burst_time, &proc[i].arrival_time); proc[i].pid = i + 1; proc[i].waiting_time = 0; proc[i].turnaround_time = 0; } sortArrivalTime(proc, n); findAvgTime(proc, n); return 0; } ``` 该代码实现FCFS调度算法,并计算出了平均等待时间和平均周转时间。输入进程数量和每个进程的执行时间和到达时间,然后按到达时间排序,并计算出等待时间和周转时间,最后输出平均等待时间和平均周转时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值