算法(2)——链表习题

题目:0:给定链表 L 和链表 P ,它们包含以升序排列的整数。操作 PrintList  ( L , P ),将打印 L 中那些由 P 所指定位置上的元素,如 P 中的元素为 1 4 5,则打印 L 中第 1,4,5个元素。

解法1: 计算记录每次 L 中遍历的步长 来打印相应节点的元素。

解法2: 循环遍历 L 并且 由整形变量记录走到第 n 个元素处,若这个 n 与 P的记录的数据相同,则打印  L 中该节点的数据。

 1 #include <stdio.h>
 2 #include "list.c"
 3
 4 void PrintPos (List L,List P)  {
 5   Position Ppos,Lpos;
 6   Ppos = First(P);
 7   Lpos = First(L);
 8
 9   int pre,now,step;
10   pre = 1;
11
12   while (Lpos != NULL && Ppos !=  NULL)  {
13
14     now = Ppos->Element;
15
16     step = now - pre;
17     for (int i = 0; i < step ; i++)
18       Lpos = Advance (Lpos);
19
20     printf ("%d  ",Lpos->Element);
21     pre = now;
22     Ppos = Advance(Ppos);
23   }
24 }
25
26
27
28 int main()  {
29
30     List L = MakeEmpty(NULL);
31     Position Lpos = Header(L);
32
33     List P = MakeEmpty(NULL);
34     Position Ppos = Header(P);
35
36     for (int i = 0;i < 10;i++)  {
37       Insert(i,L,Lpos);
38       Lpos = Advance(Lpos);
39     }
40
41     Insert(1,P,Ppos);
42     Ppos = Advance(Ppos);
43     Insert(3,P,Ppos);
44     Ppos = Advance(Ppos);
45     Insert(9,P,Ppos);
46
47     PrintPos(L,P);
48
49     return 0;
50  }

solution0.c

 1 #include <stdio.h>
 2 #include "list.c"
 3
 4 void PrintPos (List L, List P)  {
 5   Position Lpos = Header (L);
 6   Position Ppos = First (P);
 7
 8   int vstl=0;
 9
10   while ( Lpos != NULL && Ppos != NULL )  {
11     if  (vstl++ == Ppos->Element)  {
12
13       if (Ppos->Element <= 0)  ;
14       else printf ("%d ",Lpos->Element);
15
16       Ppos= Advance(Ppos);
17     }
18
19     Lpos = Advance(Lpos);
20   }
21 }
22
23 int main()  {
24
25     List L = MakeEmpty(NULL);
26     Position Lpos = Header(L);
27
28     List P = MakeEmpty(NULL);
29     Position Ppos = Header(P);
30
31     for (int i = 0;i < 10;i++)  {
32       Insert(i,L,Lpos);
33       Lpos = Advance(Lpos);
34     }
35
36     Insert(1,P,Ppos);
37     Ppos = Advance(Ppos);
38     Insert(3,P,Ppos);
39     Ppos = Advance(Ppos);
40     Insert(9,P,Ppos);
41
42     PrintPos(L,P);
43
44     return 0;
45  }

solution1.c

题目1:通过只调整指针交换单链表的的两个节点

 1 #include <stdio.h>
 2 #include "list.c"
 3
 4 void SwapNode (List L, Position P1, Position P2)  {
 5   Position pre = FindPrevious(P1->Element,L);
 6   Position tmp = Advance(P2);
 7
 8   pre-> Next = P2;
 9   P2 -> Next = P1;
10   P1 -> Next = tmp;
11
12 }
13
14 int main()  {
15
16     List L = MakeEmpty(NULL);
17     Position Lpos = Header(L);
18
19
20     for (int i = 0;i < 10;i++)  {
21       Insert(i,L,Lpos);
22       Lpos = Advance(Lpos);
23     }
24
25     PrintList(L);
26     printf("\n");
27
28     Position P1 = Find (3,L);
29     Position P2 = Advance (P1);
30     SwapNode (L,P1,P2);
31
32     PrintList(L);
33
34     return 0;
35  }

SwapNode.c

时间: 2024-10-01 03:59:29

算法(2)——链表习题的相关文章

算法-蓝桥杯习题(六)

蓝桥杯习题 蓝桥杯练习系统习题加答案,总共分为6部分,90%习题使用C语言解答,部分使用C++或者Java.大部分习题为搜索参考或者别人提供所得,不足之处在所难免,恳请批评指正(预计200多题,习题仅供学习交流) 目录 算法训练(详见 算法-蓝桥杯习题(一))Go 算法训练(详见 算法-蓝桥杯习题(二))Go 算法提高(waiting...) 历届试题(详见 算法-蓝桥杯习题(六))Go 历届试题(详见 算法-蓝桥杯习题(七))Go 蓝桥杯练习系统评测数据 链接: http://pan.baid

算法-蓝桥杯习题(四)

蓝桥杯习题 蓝桥杯练习系统习题加答案,总共分为6部分,90%习题使用C语言解答,部分使用C++或者Java.大部分习题为搜索参考或者别人提供所得,不足之处在所难免,恳请批评指正(预计200多题,习题仅供学习交流) 目录 算法训练(详见 算法-蓝桥杯习题(一))Go 算法训练(详见 算法-蓝桥杯习题(二))Go 算法提高(waiting...) 历届试题(详见 算法-蓝桥杯习题(六))Go 历届试题(详见 算法-蓝桥杯习题(七))Go 蓝桥杯练习系统评测数据 链接: http://pan.baid

图解堆算法、链表、栈与队列(Mark)

原文地址: 图解堆算法.链表.栈与队列(多图预警) 堆(heap),是一类特殊的数据结构的统称.它通常被看作一棵树的数组对象.在队列中,调度程序反复提取队列中的第一个作业并运行,因为实际情况中某些时间较短的任务却可能需要等待很长时间才能开始执行,或者某些不短小.但很重要的作业,同样应当拥有优先权.而堆就是为了解决此类问题而设计的数据结构.--

算法学习 - 链表的游标实现~ C++

链表的游标实现,就是用另外一种方法来访问链表,模拟游标. 在我学习的理解中,就是创建一个节点数组,模拟内存的排列,然后从其中来申请内存和释放内存.但是实际的内存没有被释放~ 下面直接贴代码了: // // main.cpp // CursorList // // Created by Alps on 14-7-27. // Copyright (c) 2014年 chen. All rights reserved. // #include <iostream> #define CursorSp

Java数据结构和算法之链表

三.链表 链结点 在链表中,每个数据项都被包含在'点"中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中都包含一个对下一个点引用的字段(通常叫做next)但是本身的对象中有一个字段指向对第一个链结点的引用. 单链表 用一组地址任意的存储单元存放线性表中的数据元素. 以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  = 结点(表示数据元素 或 数据元素的映象) 以"结点的序列&q

算法-蓝桥杯习题(七)

蓝桥杯习题 蓝桥杯练习系统习题加答案,总共分为6部分,90%习题使用C语言解答,部分使用C++或者Java.大部分习题为搜索参考或者别人提供所得,不足之处在所难免,恳请批评指正(预计200多题,习题仅供学习交流) 目录 算法训练(详见 算法-蓝桥杯习题(一))Go 算法训练(详见 算法-蓝桥杯习题(二))Go 算法提高(waiting...) 历届试题(详见 算法-蓝桥杯习题(六))Go 历届试题(详见 算法-蓝桥杯习题(七))Go 蓝桥杯练习系统评测数据 链接: http://pan.baid

算法:链表

通过链表的一些题目,了解链表的基本操作实现,掌握递归算法的基本思路,掌握扎实的编程习惯. 一.单链表基本操作 1.1.单链表节点定义 struct ListNode { int value; ListNode *pNext; }; 1.2.在尾部插入节点 void AddToTail(ListNode *pHead, int value) { /* * 尾部插入 * 添加空的头结点,简化代码 */ ListNode *node = new ListNode(); node->value = va

C++算法之链表排序的代码

下面的资料是关于C++算法之链表排序的代码. { return; while(curr){ prev = curr; curr = curr->next; insert_for_sort_operation(ppNode, prev); } return; } b)对于待插入的节点,选择合适的位置插入即可 { return; } while(cur){ if(pNode->data < cur->data) break; prev = cur; cur = cur->next

链表习题(4)-有一个带头结点的单链表,编写算法使其元素递增有序

1 /*有一个带头结点的单链表,编写算法使其元素递增有序*/ 2 /* 3 算法思想:利用直接插入排序的思想,先构成只含有一个数据结点的有序单链表,然后依次插入 4 剩余结点到合适的位置. 5 */ 6 void Sort(LinkList& L) 7 { 8 LNode *p = L->next, *pre; 9 LNode *r = p->next; 10 p->next = NULL; 11 while (p) 12 { 13 r = p->next; 14 pre