数据结构算法编程题,删除带头结点的单链表中最大元素或最小元素

如题所述

第1个回答  2013-01-10
//删除单链表中最大元素
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追问

max->next=max->next->next;你的这句有问题吧,应该是max的前驱=max的next.

追答

没问题的:删除指针当前所指结点你会用什么办法?我的办法是取当前指针所指的下一个结点值然后赋给当前结点,再把下个结点删掉。比如A->B->C->D四个结点,当前指针指在B,你想删除B结点,那么我就把C的值赋给B结点,单链表变为A->C->C->D,现在当前指针指在第一个C上,现在我删除掉当前指针的下个结点也就是第二个C,单链表就变为A->C->D,成功删除B

本回答被提问者采纳
第2个回答  2013-01-11
正确的程序如下:VC++6.0下运行正常。

#include <stdio.h>
#include <malloc.h>

//结构体,用整数作数据
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<min) min=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);
}

希望对你有帮助本回答被网友采纳
相似回答