分解成两步,1、先找到,2、再删除
以最大元素为例
1、头指针head,遍历链表,把最大的位置和链表记录下来
nod *pmax = head; //pmax保存着最大值对应的上一个节点指针
int max = head->data; //保存最大值比较
while(head->nex != NULL) //遍历链表直到尽头
{
if(max < head->next->data) //找到一个比max还大的,更新相应的位置
{
pmax = head;
max = head->next->data;
}
head = head->nex ;
}
2、删除pmax的next节点
步骤1、保存pmax-next->next信息
步骤2、释放pmax-next,
步骤3、把步骤1中保存的:pmax-next->next节点 挂到pmax上
正确的程序如下:VC++6.0下运行正常。
#include
#include
//结构体,用整数作数据
typedef struct tNODE
{
int data;
struct tNODE *next;
}NODE;
//删除链表,回收空间
void clear(NODE *head)
{
NODE *p;
while(head)
{
p=head->next;//保存下一个结点的地址
free(head);//删除最先的一个结点
head=p;//指向下一个结点
}
}
//输出整个链表中的数据
void write(NODE *head)
{
NODE *p=NULL;
p=head->next;//因为使用带头结点的链表,所以要跳过第一个结点
while(p)
{
// printf("%d",p->data);
printf("%d",p->data);
p=p->next;//后移
}
printf("\n");
}
//生成链表,以-1表示结束
NODE *create()
{
NODE *h, *t;
int x;
h=(struct tNODE *)malloc(sizeof(NODE));//建立头结点
t=h;
printf("生成链表,以-1表示结束:\n");
scanf("%d", &x);
while(x!=-1)
{
t->next=(struct tNODE *)malloc(sizeof(NODE));
t=t->next;
t->data=x;
scanf("%d", &x);
}
t->next=NULL;
// free(t);
return h;
}
NODE *Del_min_max(NODE *h)
{
NODE *p;
int max=0,min;
p=h->next;
/* if (p->data > p->next->data)
{
max=p->data;
min=p->next->data;
}
else
{
max=p->data;
min=p->next->data;
}
p=p->next->next;*/
min=p->data;
max=p->data;
while(p)
{
if (p->data>max) max=p->data;
else if (p->data
p=p->next;
}
p=h->next;
NODE *pre=h;
while(p)
{
if ((p->data==min)||(p->data==max))
{
pre->next=p->next;
free(p);
p=pre->next;
}
else
{
pre=p;
p=p->next;
}
}
return h;
}
void main()
{
NODE *head;
NODE *p;
head=create();
p=head->next;
write(head);
Del_min_max(head);
write(head);
clear(head);
}
希望对你有帮助
楼上V5,达人啊~