單鏈表刪除元素


已知線性表中的元素以值遞增有序排列,並以單鏈表作存儲結構。試設計一個高效的算法,刪除表中所有值大於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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM