链表(排序和删除)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

typedef struct link
{
    int num;
    struct link *next;
}IA;
IA *Create();
IA *Insert (IA *head, IA *p);
void Print(IA *head);
int main()
{
    IA * head = NULL;
    int num;
    head = Create();
    scanf("%d",num);
    Delete(head, num);
    return 0;
}
IA *Create()
{
    IA *head = NULL, *p;
    int num;
    while(~scanf("%d",&num)&&num >= 0){
            p = (IA*)malloc(sizeof(IA));
            p -> num = num;
            head = Insert(head,p);
    }
    Print(head);
    return head;
}
IA *Insert(IA *head,IA *p)
{
    IA *ptr, *ptr1, *ptr2;
    ptr = p;
    ptr1 = head;//ptr表示插入的,ptr1表示头文件,ptr2过渡
    if(head == NULL){
            head = p;
           p -> next = NULL;
    }//第一个数直接放入
    else
    {
        while( ptr-> num > ptr1 -> num && ptr1 -> next!=NULL)
        {
            ptr2 = ptr1;//ptr2保存头指针
            ptr1 = ptr1 -> next;//如果p的大小大于头指针那么头指针一直下去
        }
        if(ptr -> num <= ptr1 -> num){
                if(ptr1 == head)   //头指针没移动,说明插在左边
                    head = ptr;    //头指针就是p
                else   ptr2 ->next = ptr;//如果头指针移动了那么头指针的下一个就是p
                ptr -> next = ptr1;//结束后p的下一个就是原来头指针
                 }
        else {//最后一个数
                ptr1 ->next = ptr;
                ptr -> next = NULL;
        }
     }
        return head;
    }
    void Print(IA *head)
    {
        IA *p;
        if( head == NULL)
            return ;
        for( p = head; p != NULL; p = p -> next)
        printf("%d ",p -> num);
    printf("\n\n");
}
VOID *Delete(IA *head, int num)
{
    IA *ptr1, *ptr2;
    if(head == NULL)
        return ;
    while(head -> num == num){   //如果最小的数就是num那么第一个开始就替换
            ptr1 = head;
            head = head -> next;
            free(ptr1);
    }
    ptr1 = head;//ptr1记录当前指针,ptr2记录下一个指针
    ptr2 = head -> next;
    while(ptr2 != NULL){ //一直执行到最后
            if(ptr2 -> num == num){//如果下一个指针的值就是num那么ptr1的下一个就是ptr2的下一,把ptr2覆盖了
                    ptr1 -> next = ptr2 -> next;
                   free(ptr2);
            }
            else ptr1 = ptr2 -> next;//否则的话接下去遍历
            ptr2 = ptr1 -> next;
    }
    Print(head);
}

虽然注释了但还是写不出来,得慢慢磨orz

时间: 2024-10-10 05:12:15

链表(排序和删除)的相关文章

链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述

关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学习过算法的系统性的课程,现在还是处于不断摸索的阶段,好多算法题目根本就没有什么思路,导致自己对好多题目都很是头疼,就算是自己做过的一些算法的题目,再次遇到也还是不一定会做出来,他给出的建议就是,看懂别人的程序,然后自己去敲,一定会出错,然后调试,有错误接着调试,一直到没有错误为止,并且要时常的去复习

基本排序(四):索引指针排序、链表排序、关键字排序

1. 索引和指针排序 因为元素的数量或者数据量巨大等原因,我们不希望频繁移动要排序的元素.因此,不移动元素的排序方法是维持一个索引数组或者索引指针,而排序的目标就是重排索引数组或指针. 如: 初始化for(int i = 0; i < N; i++) a[i] = &data[i]; 使用间接比较#define less(A, B) (*A < *B) 使用下标或指针排序的主要原因是避免扰乱要排序的数据.我们可以对只读文件进行排序,或者针对一个文件的多个关键字进行排序. 另一个原因是避

链表排序

链表是一种在物理存储上非连续,非顺序的存储结构,数据的逻辑关系是通过指针链接次序实现的,链表通过一系列结点组成,结点可以在运行时动态生成.每个结点由两部分组成:数据域和存储下一结点的指针域.链表是一种常见的数据结构. 要想进行链表排序,首先得建立一个单链表,程序代码是由一个数组转化而来,代码如下: 先建立一个结点的结构体: struct node { int val; node *next; }; node* _initial_node() //生成一个空的链表 { node *head=new

【模板小程序】链表排序(qsort/insert_sort/merge_sort)

前言 本文章整理了链表排序的三种方法,分别是快速排序.插入排序.归并排序.为适应不同用途,先给出常用的int版本,再在此基础上抽象出类模板. 目录 一.针对整数的版本(常用) 文中链表定义 链表相关操作 三种排序方法 完整测试程序 二.模板版本(适用性广泛) 文中链表定义 链表相关操作 三种排序方法 完整测试程序 总结 参考文章 一.针对整数的版本(常用) 文中链表定义: 1 //definition for singly-linked list. 2 struct ListNode 3 { 4

C语言实现单链表节点的删除(带头结点)

我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https://github.com/chenyufeng1991/DeleteLinkedList_HeadNode.删除类型有两种: (1)删除某个位置pos的节点: (2)推断x值是否在链表中,若存在则删除该节点: 核心代码例如以下: //删除某个位置pos的节点 Node *DeletePosNode(Node

C语言 链表排序

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <assert.h> 4 5 typedef struct node{ 6 int data; // 存放数据 7 struct node* next; // 下一节点 8 }ListNode; 9 10 extern int CSort(); 11 12 ListNode *root = NULL;// 13 14 int main(int argc, char

单链表的插入删除操作(c++实现)

下列代码实现的是单链表的按序插入.链表元素的删除.链表的输出 // mylink.h 代码 #ifndef MYLINK_H #define MYLINK_H #include<iostream> using namespace std; struct node { int data; node *next; }; class list { public: list() { head=NULL; }; void insert(int item); void del(int item); voi

Sort List &amp;&amp; Insertion Sort List (链表排序总结)

Sort List Sort a linked list in O(n log n) time using constant space complexity. Have you been asked this question in an interview?                   Yes               说明:归并排序: 时间 O(nlogn),空间 O(1). 每次将链表一分为二, 然后再合并.快排(用两个指针) /** * Definition for sing

148. Sort List (java 给单链表排序)

题目:Sort a linked list in O(n log n) time using constant space complexity. 分析:给单链表排序,要求时间复杂度是O(nlogn),空间复杂度是O(1).时间复杂度为O(nlogn)的排序算法有快速排序和归并排序, 但是,对于单链表来说,进行元素之间的交换比较复杂,但是连接两个有序链表相对简单,因此这里采用归并排序的思路. 编码: public ListNode sortList(ListNode head) { if(hea

笔试,面试,C/C++,数据结构单链表排序(改进冒泡排序)

void BubbleSortNode(SListNode *&pHead)//单链表排序 {  assert(pHead);  SListNode *tail = NULL;  int Bool = 0;  //若没有进行交换提前返回  while (tail!=pHead->next)  {   Bool = 0;   SListNode *tmp = pHead;   SListNode *tmpnext = tmp->next;   while (tmp->next !=