您的位置:首页 > 其它

单链表删除元素

2016-04-17 22:13 246 查看
已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试设计一个高效的算法,删除表中所有值大于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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: