给定一个顺序存储的线性表L=(a1,a2,.....,an),请设计一个算法删除所有值大于min而且小于max的元素
这也没啥算法可说,遍历线性表,将小于等于min或大于等于max的元素,复制到线性表从0开始的位置,并统计元素数量,最后将线性表的长度值改为统计出来的元素数量就行了。算法时间复杂度为O(n)
遍历就可以了
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType; //元素值域类型为int型
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode, *LinkList;
void createLinkList(LinkList &L);
void deleteElem(LinkList &L, int min, int max);
void printLinkList(LinkList L);
int main()
{
LinkList L;
ElemType min, max;
createLinkList(L);
printf("输入要删除的最小值和最大值:");
scanf("%d%d", &min, &max);
deleteElem(L, min, max);
printLinkList(L);
return 0;
}
void createLinkList(LinkList &L)
{
L = (LinkList)malloc(sizeof(LNode));
//r始终指向尾结点,初始指向L,即头结点
LNode *r = L;
LNode *s;
int size;
printf("创建链表,请输入链表大小:");
scanf("%d", &size);
for (int i = 1; i <= size; i++)
{
s = (LinkList)malloc(sizeof(LNode));
int x;
printf("请输入第%d个元素:", i);
scanf("%d", &x);
s->data = x;
r->next = s;
r = s;
}
r->next = NULL;
}
void deleteElem(LinkList &L, int min, int max)
{
LNode *p = L->next, *pre = L, *tmpNode;
//循环条件:p不为空
//若为NULL说明已遍历完成
while (p)
{
if (p->data<min | p->data> max)
{
pre = pre->next;
p = p->next;
}
else
{
printf("删除%d \n", p->data);
tmpNode = p; //tmpNode指向该结点
p = p->next;
pre->next = p; //删除*tmpNode结点
free(tmpNode); //释放*tmpNode结点
}
}
}
void printLinkList(LinkList L)
{
//输出链表元素值,每个值后输出一个空格
LinkList p = L->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
可以啦!可以。