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
  • 相关阅读:
    101. Symmetric Tree(js)
    100. Same Tree(js)
    99. Recover Binary Search Tree(js)
    98. Validate Binary Search Tree(js)
    97. Interleaving String(js)
    96. Unique Binary Search Trees(js)
    95. Unique Binary Search Trees II(js)
    94. Binary Tree Inorder Traversal(js)
    93. Restore IP Addresses(js)
    92. Reverse Linked List II(js)
  • 原文地址:https://www.cnblogs.com/emptyCoder/p/5402511.html
Copyright © 2011-2022 走看看