#includestruct x
{
int first;
int last;
};
typedef struct node
{
struct x data;
struct node *next;
}node;
struct node *head=NULL;
void initnode()
{
head=(node *)malloc(sizeof(node));
head->next=NULL;
}
node *insnode(const int e) //插入操作
{
node *s,*p,*q,*r,*m;
p=head;
m=head;
//s=(node *)malloc(sizeof(node));
//s->data.first=e;
if(head==NULL)
{
s=(node *)malloc(sizeof(node));
s->data.first=e;
s->data.last=e;
head=s;
s->next=NULL;
}
else
{
while(p!=NULL)
{
if(p->data.last+1==e)
{
p->data.last=e;
if(p->next!=NULL)
{
if(p->next->next==NULL)
{
q=p;
r=p->next;
if(q->data.last+1==r->data.first)
{
q->data.last=r->data.last;
free(r);
q->next=NULL;
}
}
else
{
q=p;
r=p->next;
p=p->next->next;
if(q->data.last+1==r->data.first)
{
q->data.last=r->data.last;
free(r);
q->next=p;
}
}
}
break;
}
if(p->data.first==(e+1))
{
p->data.first=e;
break;
}
q=p;
p=p->next;
}
while(m->next!=NULL&&e>m->data.last)
{
q=m;
m=m->next;
}
if(edata.first)
{
if(m==head)
{
s=(node *)malloc(sizeof(node));
s->data.first=e;
s->data.last=e;
s->next=m;
head=s;
}
else
{
s=(node *)malloc(sizeof(node));
s->data.first=e;
s->data.last=e;
q->next=s;
s->next=m;
}
}
if(e>m->data.last)
{
s=(node *)malloc(sizeof(node));
s->data.first=e;
s->data.last=e;
m->next=s;
s->next=NULL;
}
}
return head;
}
node *delnode(const int e) //删除操作
{
node *p,*q,*s,*r;
if(head==NULL)
return NULL;
p=head;
while(p->next!=NULL&&e>p->data.last)
{
q=p;
p=p->next;
}
if(e<=p->data.last&&e>=p->data.first)
{
if(p->next==NULL)
{
if(p==head&&p->data.first==p->data.last)
{
free(p);
}
else if(p!=head&&p->data.first==p->data.last)
{
free(p);
q->next=NULL;
}
else//if(p->data.first!=p->data.last)
{
if(e==p->data.last)
{
p->data.last=e-1;
}
else
{
if(e==p->data.first)
{
p->data.first=e+1;
}
else
{
s=(node *)malloc(sizeof(node));
s->data.first=e+1;
s->data.last=p->data.last;
p->data.last=e-1;
p->next=s;
s->next=NULL;
}
}
}
}
else
{
r=p->next;
if(p==head&&p->data.first==p->data.last)
{
free(p);
head=r;
}
else if(p!=head&&p->data.first==p->data.last)
{
free(p);
q->next=r;
}
else//if(p->data.first!=p->data.last)
{
if(e==p->data.last)
{
p->data.last=e-1;
}
else
{
if(e==p->data.first)
{
p->data.first=e+1;
}
else
{
s=(node *)malloc(sizeof(node));
s->data.first=e+1;
s->data.last=p->data.last;
p->data.last=e-1;
p->next=s;
s->next=r;
}
}
}
}
}
else if(edata.first||e>p->data.last)
{
printf("删除错误!\n");
}
return head;
}
void show()
{
node *p;
p=head;
while(p!=NULL)
{
printf("%d_%d ",p->data.first,p->data.last);
p=p->next;
}
printf("\n");
}
int main()
{
insnode(1);
insnode(3);
insnode(2);
insnode(5);
insnode(7);
insnode(6);
// insnode(4);
show();
//delnode(6);
//delnode(3);
//delnode(7);
//delnode(1);
//delnode(7);
// delnode(5);
//delnode(3);
//show();
return 0;
}
//其实我就是楼主。。。。第二问中123捆绑在一起,只记录1和3。这道问题是为了节省内存,如果输入1到1亿个数字,只需记录1和1亿。不过我这方法好烦,有没有那位大大更简单点。。。