单链表删除元素

已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试设计一个高效的算法,删除表中所有值大于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

 

posted @ 2016-04-17 22:13  我在这儿  阅读(2996)  评论(0编辑  收藏  举报