【将链表ha中结点值大于min小于max的结点删除,接到另一个结点后面构造成单向递增有序链表】
#include <stdio.h>
#include <stdlib.h>
typedef struct linkednode // 链表结点类型
{
int data;
struct linkednode * next;
}snode,*ptr;
ptr creatlink() // 向前插入法
{
ptr head,p;
head = NULL;
int x;
scanf("%d",&x);
while(x!=1000)
{
p = (ptr)malloc(sizeof(snode));
p->data = x;
p->next = head;
head = p;
scanf("%d",&x);
}
return (head);
}
ptr spilt(ptr ha,int min,int max) // 将 min<结点值<max的结点从链表删除,将这些结点单独做成一个带表头监督元的结点的单项递增有序链表
{
ptr hb,p,q,s;
hb = (ptr)malloc(sizeof(snode));
hb->next = NULL;
q = NULL;
s = ha;
while(s != NULL) // 如果有要删除的结点,那么p在要删除的结点之后,s正好指向第一个要删除的结点
if(s->data <= min){p = s;s = s->next}
else break;
if(s == NULL)
return hb;
while(s != NULL) // 将q指向要删除的最后一个结点,s指向该结点后继结点
if(s->data < max){q = s;s = s->next}
else break;
if(q == NULL)
return hb;
q->next = NULL; // 将最后一个结点置空
hb->next = p->next; // 将头结点与剩余删除的结点连接起来 构造hb链表
p->next = s; // 将该删除结点从链表ha中删除
return hb;
}
int main()
{
ptr ha,hb,p1,p2;
ha = creatlink();
p1 = ha;
while(p1!=NULL)
{
printf("%d ",p1->data);
p1 = p1->next;
}
return 0;
}