求一个算法:删除链表中最大元素或最小元素, 数据结构题,c语言版的,急!急!写的好的追加五十财富值。
3个回答
展开全部
分解成两步,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上
以最大元素为例
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 <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);
}
希望对你有帮助
#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);
}
希望对你有帮助
追问
不要程序要个算法,只要这个函数的算法,其他主函数什么了都不用。越简单越好。
追答
void DeleteMax(List Head)
{
Node * p = Head,q = p;
while(NULL != q)
{
if(p->value value)
p = q;
q = q->next;
}
if(p == Head)
Head = Head->next;
else
{
while(q->next != p)
{
q = q->next;
}
q->next = p->next;
}
free(p);
p = NULL;
}
这是删除最大项的,最小项同理。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上V5,达人啊~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询