已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一算法,删除表中所有大于mink且小于mark的所有元素(若表中存在这样的元素),同时释放被删除结点空间。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node
{
int data;//数据
int length;//长度
struct node *next;
}Node,*LinkList;
//删除超过范围的内容
void deLinkList(LinkList L,int mink,int maxk)
{
LinkList p,q;p=L;
while(p!=NULL)
{
if(p->data>mink&&p->data<maxk)
{
printf("找到错误目标\n");
q=p->next;
p->data=q->data;
p->next=q->next;
free(q);
}
else p=p->next;
}
}
//得到要输入的数据数量
int getnumber()
{
int n;
printf("请输入你要录入的数据数量:");
scanf("%d",&n);
return n;
}
/*建立链表
后插入法创造链表
算法时间复杂度为O(n)
*/
LinkList init(int n)
{
int i;
LinkList L;
Node *r;
Node *p;
L=(LinkList)malloc(sizeof(Node));//建立一个带头指针的空链表
L->next=NULL;
r=L;//尾指针r指向头结点
for(i=1;i<=n;i++)
{
p=(Node *)malloc(sizeof(Node));//生成新结点
printf("输入第%d位的数据:",i);//输入元素值赋给新结点*p的数据域
scanf("%d",&p->data);
p->next=NULL;//将新结点*p插入尾结点*r之后
r->next=p;//r指向新的尾结点*p
r=p;
}
L->length=n;
return L;
}
//展示信息
//算法的时间复杂度未O(n),n为单链表中的数据节点的个数
void show(LinkList L)
{
int i=0;
Node *p;
p=L->next;
while(p)
{
i++;
printf("第%d位的数据:%d\n",i,p->data);
p=p->next;
}
printf("\n信息已全部输出\n");
}
//主函数
int main()
{
int n,mink,maxk;
LinkList L;
n=getnumber();
L=init(n);
show(L);
//删除mink~maxk之间的元素
printf("请输入mink、maxk的值\n");
scanf("%d%d",&mink,&maxk);
deLinkList(L,mink,maxk);
show(L);
free(L);
}
输出
输入
6
0
1
2
3
4
5