//设一个指针p指向了链表中的一个结点,删除这个指针所指的结点
//这里采用了类似狸猫换太子的方法,以结点中的值为主,将待删结点的值与其后面的结点的值交换,
//然后后面的结点就有了前驱指针,就可以删除了
void Delthekey(ElemSN *p)
{
ElemSN *q;
int t;
t=p->data;
p->data=p->next->data;
p->next->data=t;
q=p->next;
p->next=q->next;
free(q);
}
//设head指向一个非空单向链表,设数据域的值不重复,删除链表中的最大值结点
#include<stdio.h>
#include<stdlib.h>
#define N 6
typedef struct odd{
int data;
struct odd *next;
}ElemSN;
ElemSN *Createlink(int a[])
{
ElemSN *h,*tail;
h=tail=(ElemSN *)malloc(sizeof(ElemSN));
h->data=a[0];
h->next=NULL;
for(int i=1;i<N;i++){
tail=tail->next=(ElemSN *)malloc(sizeof(ElemSN));
tail->data=a[i];
tail->next=NULL;
}
return h;
}
ElemSN *Delone(ElemSN *h)
{
//查找
ElemSN *p,*q,*pmax,*qmax=NULL,*x;
pmax=h;
for(q=h,p=h->next;p;q=p,p=p->next){
if(p->data>pmax->data) //找最大值
{
pmax=p;
qmax=q;
}
}
//删除最大值
//头删
if(pmax==h){
h=h->next;
}
else{
//尾删
qmax->next=pmax->next;
}
free(pmax);
pmax=NULL;
return h;
}
void Printlink(ElemSN *h)
{
ElemSN *p;
for(p=h;p;p=p->next){
printf("%d",p->data);
}
}
int main()
{
int i,key;
int a[6]={10,2,9,3,4,8};
ElemSN *head=NULL,*pkey,*t;
//建立单向链表
head=Createlink(a);
//删除最大值
pkey=Delone(head);
Printlink(pkey);
return 0;
}