已知线性表的元素递增有序,并以带头结点的单链表作存储结构,设计一个高效算法,删除表中所有大于mink且小于maxk的元素。
#include <stdio.h>
#include <stdlib.h>
//自定义,最后一定要加分号
//typedef int Elemtype;
typedef struct Node
{
int data;
//这里struct结构体标识符别掉了
struct Node *next;
}Node;
//此类型是结构体指针,别把*写掉了
typedef struct Node* Linklist;
//初始化链表
void InitList(Linklist *l)
{
(*l) = (Linklist)malloc(sizeof(Node));
if(!(*l))
{
printf("初始化失败!\n");
exit(1);
}
(*l)->next = NULL;
printf("初始化成功!\n");
}
//尾插法建立链表
void CreateList(Linklist *l,int n)
{
int j,i = 0;
Linklist p,temp;
temp = (*l);
while(i<n)
{
i++;
//注意分配的是Node大小的空间不是int大小
p = (Linklist)malloc(sizeof(Node));
if(!p)
{
printf("创建失败!\n");
exit(1);
}
p->next = NULL;
printf("请输入你要跳入表中的第%d个数:\n",i);
scanf("%d",&j);
//注意先输入值再赋值给p->data
p->data = j;
temp->next = p;
temp = p;
}
printf("创建成功!\n");
}
void Delete(Linklist *l,int mink,int maxk)
{
Linklist pre,p,q,s;
pre = (*l);
p = (*l)->next;
while(p!=NULL&&(p->data<mink||p->data==mink))
{
pre = p;
p = p->next;
}
if(p)
{
while(p!=NULL&&p->data<maxk)
p = p->next;
//修改指针
q = pre->next;
pre->next = p;
//释放pre到p之间的节点空间
while(q!=p)
{
s = q->next;
free(q);
q = s;
}
}
printf("删除成功!\n");
}
void PrintList(Linklist *l)
{
Linklist p;
int j,i = 0;
p = (*l)->next;
printf("*******************打印整个链表***********************\n");
if(p==NULL)
{
printf("这是一个空链表!\n");
}
while(p)
{
i++;
j = p->data;
printf("第%d个节点的数据为:%d\n",i,j);
p = p->next;
}
}
int main()
{
int n = 5;
int mink = 2;
int maxk = 6;
Linklist la;
InitList(&la);
CreateList(&la,n);
PrintList(&la);
Delete(&la,mink,maxk);
PrintList(&la);
return 0;
}