【问题描述】有一个整数序列采用带头结点的单链表L存储。设计一个算法,删除单链表L中data值大于等于min且小于等于max的结点(若表中有这样的结点),同时释放被删结点的空间,这里min和max是两个给定的参数。
【输入形式】输入2行数据:第1行为任意整数序列(由此创建单链表),第2行为min何max
【输出形式】输出原单链表及删除后的单链表。
【样例输入】
5 1 3 6 8 2 4 8 1
3 7
【样例输出】
L: 5 1 3 6 8 2 4 8 1
删除3~7的结点
L: 1 8 2 8 1
#include <iostream>
using namespace std;
typedef struct Link
{
int data;
struct Link *next;
} LinkList;
//无头结点尾插法
LinkList *Create()
{
LinkList *head, *s, *end;
int i = 0;
head = NULL;
int k;
while (cin >> k)
{
s = new LinkList;
s->data = k;
if (i == 0)
{
end = s;
end->next = NULL;
head = end;
}
else
{
end->next = s;
s->next = NULL;
end = s;
}
i++;
if (cin.get() == '\n')
break;
}
return head;
}
//删除给定范围的元素
LinkList *DeleteRange(LinkList *L, int m, int n)
{
if (L == NULL)
return L;
LinkList *p;
if (m <= L->data && L->data <= n)
{
p = L;
L = L->next;
free(p);
L = DeleteRange(L,m,n);
}
else
{
L->next = DeleteRange(L->next, m, n);
}
return L;
}
int main()
{
LinkList *p;
LinkList *s;
int m, n;
p = Create();
cin >> m >> n;
s = p;
cout<<"L: ";
while (s)
{
cout << s->data << " ";
s = s->next;
}
p = DeleteRange(p, m, n);
cout<<endl<<"删除"<<m<<"~"<<n<<"的结点"<<endl;
s = p;
cout<<"L: ";
while (s)
{
cout << s->data << " ";
s = s->next;
}
system("pause");
return 0;
}
欢迎指点改错~