zoukankan      html  css  js  c++  java
  • 单链表删除元素

    已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试设计一个高效的算法,删除表中所有值大于mink和且小于maxk的元素
    (若表中存在这样的元素),同时释放被删结点空间(注意:mink和maxk是给定的两个参变量。它们的值可以和表中的元素相同,也可以不同)

    思路:找到第一个大于mink的数,标记位置,再向前找到第一个不小于maxk位置,标记前一个位置,删除两个标记之间的元素,并释放空间

    #include <stdio.h>
    #include <stdlib.h>
    #define N 8
    #define DataType int
    struct SqList{
        DataType data;
        struct SqList *next;
    }SqList;
    void AddNode(struct SqList* &head)
    {
        int i = 0;
    //    struct SqList *q = s;//引用一个空指针会出问题 
    //    for(i=0;i<N;i++)
    //    {
    //        scanf("%d",&(q->data));
    //        q->next = (struct SqList *)malloc(sizeof(SqList));
    //        q = q->next;
    //    }
    //    q = NULL;//无法将一个已经存开辟空间的指针强制转换成NULL 
    //    while(1)//不加头结点 
    //    {
    //        scanf("%d",&(q->data));
    //        if(i < N-1)
    //        {
    //            q->next = (struct SqList *)malloc(sizeof(SqList));
    //            q = q->next;
    //        }
    //        else{
    //            break;
    //        }
    //        i ++;
    //    }
    //    q->next = NULL;
        struct SqList *q = head;
        for(i = 0;i < N;i ++)
        {
            //q = q->next;//游离指针不可赋值给其它指针,
            q->next = (struct SqList *)malloc(sizeof(SqList));
            q = q->next;
            scanf("%d",&(q->data));
        } 
        q->next = NULL;
    }
    void ShowList(struct SqList* head)
    {
        struct SqList *p = head->next;
        while(p)
        {
            printf("%d ",p->data);
            p = p->next;
        }
    }
    void DeleteNode(struct SqList* &head,int mink,int maxk)//要加头结点,否则如果要删除首结点则不易删除 
    {
        struct SqList *p = head,*q = NULL,*tmp,*tmp1;
        while(p->next && p->next->data <= mink)//p指向最后一个不大于mink的元素 
            p = p->next;
        if(p->next)//如果还有比mink更大的元素
        {
            q = p->next;
            while(q && q->data < maxk)//q指向第一个不小于maxk的元素 
                q = q->next;
            //删除结点并释放空间 
            tmp = p->next;
            while(tmp != q)
            {
                tmp1 = tmp->next;//先暂时保存待释放结点的下一个结点 
                free(tmp);
                tmp = tmp1;
            }
            p->next = q;
        }
    } 
    int main()
    {
        struct SqList *head = (struct SqList *)malloc(sizeof(SqList));//链表名和重定义名应该相同
        int mink = 5,maxk = 16;
        AddNode(head); 
        //ShowList(head);
        DeleteNode(head,mink,maxk);
        ShowList(head);
        return 0;
    }
    //1 2 5 7 10 19 23 26 
    //5 16
    //3 25
    //0 23
    //0 27
  • 相关阅读:
    c&c++中的宏
    cmake教程
    什么是Grunt
    npm-install camo
    在node.js中建立你的第一个HTTp服务器
    highChart数据动态更新
    css:before和after中的content属性
    清除float浮动三种方式
    中文标准web字体
    网站桌面端和手机端不同url的设置
  • 原文地址:https://www.cnblogs.com/emptyCoder/p/5402511.html
Copyright © 2011-2022 走看看