//删除单链表中最大元素
Del-max(link a){
int tmp;
element *p;
element *max;
p=a; //指针,用于遍历链表,取数与当前最大结点值比较
max=a; //指针,用于记录最大元素所在位置(未考虑有多个最大元素)
tmp=p->data; //变量,用于记录当前最大结点值
while(a->next!=null){
p=p->next;
if(p->data>tmp){ 、//如果当前指针所指结点值大于当前tmp所保留的值,则记录
max=p; //当前位置(放入到max),记录当前最大值(放入tmp)
tmp=p->data;
} //end of if
} //end of while
tmp=max->next->data; //一次遍历后max指针所指结点就是最大元素,删除之。。。
max->data=tmp;
max->next=max->next->next; //删除方法能看懂么?好好思考。。。
}//end of Del-max
正确的程序如下: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);
}
希望对你有帮助