c语言pop逆置单链表,试用C语言编写一个高效算法,将一循环单链表就地逆置.ppt...

您所在位置:网站首页 > 海量文档

&nbsp>&nbsp高等教育&nbsp>&nbsp专业基础教材

2a1a028d081056ab14b40d3afcc4d675.gif

试用C语言编写一个高效算法,将一循环单链表就地逆置.ppt24页

本文档一共被下载:2377011b61454b208b34ad77b4c31088.gif次,您可全文免费在线阅读后下载本文档。

072ad097814a33d1ad18e33ca14a5a9e.png

9ec2792a743ebdf4575ee09a03c275ea.png

7af312d1be2cfc1e59f15880bb7a7e7a.png

5f207613e329ca76dc87c76d3ff77e64.png

adf7aa3071c520b8a2063089f549261c.png

下载提示

1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。

2.该文档所得收入(下载+内容+预览三)归上传者、原创者。

3.登录后可充值,立即自动返金币,充值渠道很便利

第三章 栈和队列 3.1 栈(Stack) 3.2 队列(Queue) Q4:为什么要设计堆栈?它有什么独特用途? 例2(严题集3.1)一个栈的输入序列为1,2,3,若在入栈的过程中允许出栈,则可能得到的出栈序列是什么? 例3:一个栈的输入序列是12345,若在入栈的过程中允许出栈,则栈的输出序列43512可能实现吗?12345的输出呢? 例4: 设依次进入一个栈的元素序列为c,a,b,d,则可得到出栈的元素序列是: A)a,b,c,d B)c,d,a,b C)b,c,d,a D)a,c,d,b 顺序栈的入栈操作——例如用堆栈存放(A,B,C,D) 顺序栈出栈操作——例如从栈中取出‘B’ 链栈的入栈操作和出栈操作(教材省略教师补充) 栈的应用举例 表达式求值过程----机内运算示意图 1.汤新宜(2002级通信5班) 2.邓新荣(2002级通信3班) * * 交第2章作业( 2.8 2.10 2.21 2.22 2.34 2.35); 周四下午/ 晚上第1次上机;请各班负责人到机房上机时卡;上机内容:线性表的插入与删除 基本要求:试用C语言编写一个高效算法,将一循环单链表就地逆置。 高级要求:请用循环链表方式制作一种彩票选号器。 1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式 1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式 调用函数或子程序非它莫属; 递归运算的有力工具; 用于保护现场和恢复现场; 简化了程序设计的问题。 下面用4个例子来帮助理解堆栈: void test(int &sum){ int x; scanf(x); if(x==0)sum=0; else{test(sum);sum+=x;} printf(sum); } 断点地址入栈 例1(严题集3.10③)阅读下列递归过程,说明其功能。 输入x1≠0 输入x5=0 输入x2 输入x3 输入x4 输出sum=0 输出sum=0+x4 输出sum=x4+x3 输出sum= x4+x3 +x2 输出sum= x4+x3 +x2+x1 注意:最先输入的数据 x1 最后才被累加 程序功能:对键盘输入数据求和,直到输入0结束 答: 可以通过穷举所有可能性来求解: ① 1入1出, 2入2出,3入3出, 即123; ② 1入1出, 2、3入,3、2出, 即132; ③ 1、2入,2出, 3入3出, 即231; ④ 1、2入,2、1出,3入3出, 即213; ⑤ 1、2、3入,3、2、1出, 即321; 合计有5种可能性。 答: 43512不可能实现,主要是其中的12顺序不能实现; 12345的输出可以实现,每压入一数便立即弹出即可。 A)、D)可以, B)、C)不行。 讨论:有无通用的判别原则? 有!若输入序列是 …,Pj…Pk…Pi …(PjM){上溢} else s[top++]=e; } Push (B); Push (C); Push (D); top

发表评论

请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。

用户名:

验证码:

c9f2bced460b0329ba0aadbbc3f0fc71.png

匿名?

发表评论

好的,以下是用 C 语言实现单链表就地逆置算法: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node *next; } Node; Node *create_list(int n) { Node *head = NULL; Node *tail = NULL; for (int i = 1; i <= n; ++i) { Node *node = (Node *)malloc(sizeof(Node)); node->data = i; node->next = NULL; if (head == NULL) { head = node; tail = node; } else { tail->next = node; tail = node; } } return head; } void print_list(Node *head) { Node *p = head; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } void reverse_list(Node **head) { Node *p = *head; Node *q = NULL; Node *r = NULL; while (p != NULL) { r = q; q = p; p = p->next; q->next = r; } *head = q; } int main() { Node *head = create_list(5); printf("Original list: "); print_list(head); reverse_list(&head); printf("Reversed list: "); print_list(head); return 0; } ``` 在这个算法中,我们定义了一个 `Node` 结构体,每个节点包含一个整数值和一个指向下一个节点的指针。我们使用 `create_list` 函数创建一个包含 `n` 个元素的单链表,并返回链表的头节点。`print_list` 函数用于打印链表中的所有元素。 重点是 `reverse_list` 函数,它使用三个指针 `p`、`q` 和 `r` 来逆置链表。其中,`p` 指向当前节点,`q` 指向上一个节点,`r` 则指向上一个节点的前一个节点。在每一次循环中,我们将 `q` 指向 `p`,然后将 `p` 指向下一个节点,最后将 `q` 的 `next` 指向 `r`。当循环结束时,`q` 就指向了原链表的最后一个节点,也就是逆置后的链表的头节点。最后,我们将原来的头节点指向逆置后的头节点即可。 在 `main` 函数中,我们创建一个包含五个元素的单链表,并打印出原来的链表。然后,我们调用 `reverse_list` 函数逆置链表,并打印出逆置后的链表。 注意,我们传递 `head` 的指针的指针给 `reverse_list` 函数,这是因为需要修改 `head` 的值,而单纯的传递指针是不够的。这种技巧在 C 语言中经常用于修改指针的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值