链表插入并自动排序操作思考
修改insert函数实现插入排序的功能,链表中的数据按从小到大排列,每次插入数据都要在链表中找到合适的位置再插入。在第 6 节 “折半查找”中我们看到,如果数组中的元素是有序排列的,可以用折半查找算法更快地找到某个元素,想一想如果链表中的节点是有序排列的,是否适用折半查找算法?为什么?
1、插入并排序 64 link insert(link lnode, char ch) 65 { 66 link node = create_node(ch); 67 link *head; 68 if(lnode==NULL){ 69 return node; 70 } 71 if(lnode->next == NULL){ 72 if(lnode->element >= ch){ 73 node->next = lnode; 74 return node; 75 } 76 } 77 for(head=&lnode; (*head)->next; head=&(*head)->next){ 78 if((*head)->element >= ch){ 79 node->next = *head; 80 *head = node; 81 return lnode; 82 } 83 } 84 (*head)->next = node; 85 return lnode; 86 } 87 关于链表折半查找 这里讨论过https://groups.google.com/forum/?fromgroups=#!topic/pongba/zYbhezWyIhI 2、 例1中 有两个if判断,我想去掉第二个,所以有了下面改写,并干脆全去掉了,这时如果lnode为空肯定直接over了 引入了一个link tail,每次遍历是记住当前*head地址, 当没有比ch大的元素,就 tail->next = node; 43 link insert(link lnode, char ch) 44 { 45 link node = create_node(ch); 46 link *head; 47 link tail; 48 printf("ch=%c\n", ch); 49 for(head=&lnode; *head; head=&(*head)->next){ 50 tail = *head; 51 if((*head)->element >= ch){ 52 printf("ch=%c\n", ch); 53 node->next = *head; 54 *head = node; 55 return lnode; 56 } 57 } 58 tail->next = node; 59 return lnode; 60 } 61 3、例2是需要返回值的,下面是参数取地址,不需要返回值的实现 47 void insert(link *list, char ch) 48 { 49 link head = malloc(sizeof(head)); 50 head->element = ch; 51 link *p = list; 52 link tail; 53 for(; *p; p=&(*p)->next){ 54 tail = *p; 55 if((*p)->element > head->element){ 56 head->next= (*p); 57 *p = head; 58 return; 59 } 60 } 61 tail->next = head; } 4、补充更简单的写法,由liuxinyu帮助 50 void insert(link *list, char ch) 51 { 52 link head = malloc(sizeof(head)); 53 head->element = ch; 54 link *p = list; 55 for(; *p && (*p)->element < ch ; p=&(*p)->next); 56 head->next = *p; 57 *p = head; 58 } 5、相关数据定义 3 typedef struct node *link; 4 struct node 5 { 6 char element; 7 link next; 8 }; 9
相关推荐
实验结果表明,所编写的程序能够正确地实现多项式链表的构建,以及按指数升序排列,同时能执行多项式的加法和乘法操作。然而,实验中提到的一个不足是,程序在进行多项式乘法后,无法自动合并同类项。这意味着虽然...
- 实战演练:基于C语言实现2-路插入排序算法。 - **第四节:堆排序实验** - 堆排序算法的定义与原理。 - 堆排序算法的实现步骤与技巧。 - 实战演练:基于C语言实现堆排序算法。 - **第五节:思考题** - 提出...
1. 排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。 2. 搜索算法:线性搜索、二分搜索、深度优先搜索(DFS)、广度优先搜索(BFS)。 3. 动态规划:解决最优化问题,如背包问题、最长公共...
- **排序算法**:如冒泡排序、选择排序、插入排序、快速排序、归并排序等。这些算法用于对数据进行有效排序,快速排序和归并排序在平均情况下的时间复杂度为O(n log n)。 - **查找算法**:二分查找、哈希查找等,...
LinkedList则基于双向链表,插入和删除速度快,但随机访问慢。 3. **Map接口**:Map接口存储键值对,每个键都是唯一的。实验中提到了HashMap和TreeMap。HashMap使用哈希表存储键值对,查找速度较快,但无特定的顺序...
算法是解决问题的步骤或方法,常见的算法有排序(冒泡排序、选择排序、插入排序、快速排序、归并排序等)、查找(线性查找、二分查找)、图算法(深度优先搜索、广度优先搜索)、动态规划、贪心算法等。通过源码,...
"数据结构1800道"可能包含了各种难度级别的问题,涵盖了基础知识到高级应用,例如查找算法(线性搜索、二分查找、哈希查找)、排序算法(冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序)以及图的遍历...
例如,数组适合随机访问,链表适合插入和删除操作,而树和图则用于解决更复杂的关系和搜索问题。 接着,我们来探讨算法。算法是一系列解决问题的明确指示,可以是计算、数据处理或自动推理的任务。常见的算法有排序...
例如,数组常用于实现排序算法,链表则适用于需要频繁插入和删除元素的情况。栈和队列可以用于回溯或状态机实现,而树和图数据结构则是图算法的基础。 以下是一些常见的C语言算法: 1. **排序算法**:冒泡排序是一...
- **思考**: 当 n 时,计数排序会浪费大量空间,可以通过哈希表进行优化。 #### 三、哈希表的关键概念与实现 - **哈希函数**: 用于将键(Key)映射到数组的索引位置。 - 示例: `H(key) = key mod p`,其中 p 是小于...
- **排序算法**:冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序等,掌握每种排序算法的时间复杂度和空间复杂度。 - **查找算法**:线性查找、二分查找等,了解各种查找算法的应用场景。 - **动态规划...
* 能对用户指定的任意课程名,按成绩升序或降序排列学生数据并显示排序结果 自动增加新功能模块 * 学生可以自动增加新功能模块,提高系统的灵活性和可扩展性 系统设计 * 使用C语言实现整个系统 * 利用指针、...
2. **循环链表**: 循环链表的特性和操作方法。 3. **双向链表**: 双向链表相较于单链表的优势,以及基本操作。 4. **队列**: 先进先出(FIFO)原则下的队列操作。 5. **栈**: 后进先出(LIFO)原则下的栈操作。 6. **...
5. 常见的数据结构有数组(快速访问,内存连续,插入删除慢)、队列(先进先出,插入和删除操作效率高)、链表(动态内存分配,插入删除快,访问慢)、栈(后进先出,插入删除快,访问受限)、哈希表(快速查找,...
链表则在内存中非连续存放,更适合频繁的插入和删除操作。栈遵循“后进先出”(LIFO)原则,常用于表达式求值、递归等;队列则是“先进先出”(FIFO)结构,常用于任务调度。集合和映射则提供了一种更高级的方式来...
3. **算法设计与分析**:学生将学习常见的排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序等)和查找算法(如线性查找、二分查找等),以及时间复杂度和空间复杂度的概念,培养他们的算法思维。...
17.1.4 向链表中插入或移除节点 495 17.1.5 搜索链表 498 17.2 链表的应用 504 17.3 迭代器 514 17.3.1 指针作为迭代器 514 17.3.2 迭代器类 515 17.4 树 520 第18章 异常处理 535 18.1 异常处理基础 535 ...
一种常见的方法是使用链表,每个节点包含一个字符,这种结构方便插入和删除。另一种方法是使用字符数组,虽然不便于动态增长,但访问速度较快。C++的`std::string`实际上使用了动态数组的实现,可以在必要时自动扩展...
它鼓励用户通过编写代码来解决这些问题,并提供了自动评测系统,确保代码的正确性和效率。LeetCode上的题目被广泛应用于技术面试,因为它们能够有效检验候选人的编程基础和逻辑思维能力。 二、源码解析的重要性 在...