`
langzhe
  • 浏览: 286383 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

链表插入并自动排序操作思考

    博客分类:
  • c
 
阅读更多

链表插入并自动排序操作思考

修改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   

 

0
0
分享到:
评论

相关推荐

    数据结构实验报告-线性表的链式存储.pdf

    实验结果表明,所编写的程序能够正确地实现多项式链表的构建,以及按指数升序排列,同时能执行多项式的加法和乘法操作。然而,实验中提到的一个不足是,程序在进行多项式乘法后,无法自动合并同类项。这意味着虽然...

    数据结构实验书

    - 实战演练:基于C语言实现2-路插入排序算法。 - **第四节:堆排序实验** - 堆排序算法的定义与原理。 - 堆排序算法的实现步骤与技巧。 - 实战演练:基于C语言实现堆排序算法。 - **第五节:思考题** - 提出...

    面试前必备(微软数据结构+算法)

    1. 排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。 2. 搜索算法:线性搜索、二分搜索、深度优先搜索(DFS)、广度优先搜索(BFS)。 3. 动态规划:解决最优化问题,如背包问题、最长公共...

    数据结构实验及其代码

    - **排序算法**:如冒泡排序、选择排序、插入排序、快速排序、归并排序等。这些算法用于对数据进行有效排序,快速排序和归并排序在平均情况下的时间复杂度为O(n log n)。 - **查找算法**:二分查找、哈希查找等,...

    实验05 Java集合.doc

    LinkedList则基于双向链表,插入和删除速度快,但随机访问慢。 3. **Map接口**:Map接口存储键值对,每个键都是唯一的。实验中提到了HashMap和TreeMap。HashMap使用哈希表存储键值对,查找速度较快,但无特定的顺序...

    数据结构-源码

    算法是解决问题的步骤或方法,常见的算法有排序(冒泡排序、选择排序、插入排序、快速排序、归并排序等)、查找(线性查找、二分查找)、图算法(深度优先搜索、广度优先搜索)、动态规划、贪心算法等。通过源码,...

    数据结构1800道.rar

    "数据结构1800道"可能包含了各种难度级别的问题,涵盖了基础知识到高级应用,例如查找算法(线性搜索、二分查找、哈希查找)、排序算法(冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序)以及图的遍历...

    数据结构与算法综合资料库

    例如,数组适合随机访问,链表适合插入和删除操作,而树和图则用于解决更复杂的关系和搜索问题。 接着,我们来探讨算法。算法是一系列解决问题的明确指示,可以是计算、数据处理或自动推理的任务。常见的算法有排序...

    C语言算法集,很有用的东西!

    例如,数组常用于实现排序算法,链表则适用于需要频繁插入和删除元素的情况。栈和队列可以用于回溯或状态机实现,而树和图数据结构则是图算法的基础。 以下是一些常见的C语言算法: 1. **排序算法**:冒泡排序是一...

    第二次哈希表.pdf

    - **思考**: 当 n 时,计数排序会浪费大量空间,可以通过哈希表进行优化。 #### 三、哈希表的关键概念与实现 - **哈希函数**: 用于将键(Key)映射到数组的索引位置。 - 示例: `H(key) = key mod p`,其中 p 是小于...

    程序员面试宝典 微软TOP3讲师著作

    - **排序算法**:冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序等,掌握每种排序算法的时间复杂度和空间复杂度。 - **查找算法**:线性查找、二分查找等,了解各种查找算法的应用场景。 - **动态规划...

    C语言课程设计成绩管理系统.pdf

    * 能对用户指定的任意课程名,按成绩升序或降序排列学生数据并显示排序结果 自动增加新功能模块 * 学生可以自动增加新功能模块,提高系统的灵活性和可扩展性 系统设计 * 使用C语言实现整个系统 * 利用指针、...

    C与C++相关面试题

    2. **循环链表**: 循环链表的特性和操作方法。 3. **双向链表**: 双向链表相较于单链表的优势,以及基本操作。 4. **队列**: 先进先出(FIFO)原则下的队列操作。 5. **栈**: 后进先出(LIFO)原则下的栈操作。 6. **...

    java笔试题目

    5. 常见的数据结构有数组(快速访问,内存连续,插入删除慢)、队列(先进先出,插入和删除操作效率高)、链表(动态内存分配,插入删除快,访问慢)、栈(后进先出,插入删除快,访问受限)、哈希表(快速查找,...

    Java语言程序设计与数据结构(基础篇)第8章课后习题代码.rar

    链表则在内存中非连续存放,更适合频繁的插入和删除操作。栈遵循“后进先出”(LIFO)原则,常用于表达式求值、递归等;队列则是“先进先出”(FIFO)结构,常用于任务调度。集合和映射则提供了一种更高级的方式来...

    《程序设计实训》课程教学大纲.docx

    3. **算法设计与分析**:学生将学习常见的排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序等)和查找算法(如线性查找、二分查找等),以及时间复杂度和空间复杂度的概念,培养他们的算法思维。...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    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-Solutions-源码.rar

    它鼓励用户通过编写代码来解决这些问题,并提供了自动评测系统,确保代码的正确性和效率。LeetCode上的题目被广泛应用于技术面试,因为它们能够有效检验候选人的编程基础和逻辑思维能力。 二、源码解析的重要性 在...

Global site tag (gtag.js) - Google Analytics