#define NULL 0
#include"stdio.h"
#include"malloc.h"
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
////////////////////////////////////////////////////////////
//*带头结点的尾插法建立单链表,返回表头指针*/
LinkList CREATLIST()
{
int data;
LinkList head,s,r;
head=(LinkList)malloc(sizeof(LNode)); /*生成头结点*/
r=head; /*尾指针初值指向头结点*/
scanf("%d",&data);
while(data!=0) /*0为输入结束符*/
{
s=(LinkList)malloc(sizeof(LNode)); /*生成新结点*/
s->data=data;
r->next=s; /*新结点插入表尾*/
r=s; /*尾指针r指向新的表尾*/
scanf("%d",&data); /*读下一结点*/
}
r->next=NULL;
return (head);
}
///////////////////////////////////////////////////////////////////
//两个有序链表的合并!!注意是升序
LinkList CONNECT(LinkList head1,LinkList head2)
{
LinkList p,p1,p2;
p=head1;
p1=head1->next;
p2=head2->next;
while(p1&&p2)
{
if(p1->data<=p2->data)
{
p->next=p1;p=p1;p1=p1->next;
}
else
{
p->next=p2;p=p2;p2=p2->next;
}
}
p->next=p1?p1:p2;//连接剩下的链表
free(head2);
return(head1);
}
////////////////////////////////////////////////////////////////
/*遍历线性表a中的元素*/
void output(LinkList head)
{
LinkList p;
p=head;
while(p->next!=NULL)
{
printf("%8d",p->next->data);
p=p->next;
}
printf("\n");
}
////////////////////////////////////////////////////////////////
/*查找合并线性表中被三整除的元素删除*/
void sdmodn(LinkList head,int n)
{
LinkList p,p1;
p=head;
p1=head;
while(p->next!=NULL)
{
p=p->next;
if((p->data)%n==0)
{
p1->next=p->next;
free(p);
p=p1;//KEY
}
else p1=p;
}
}
int main()
{
/*定义*/
LinkList head1,head2;
/*尾插建表*/
printf("\n\nInput list In increase a:(input integral end by 0)\n");
head1=CREATLIST();
/*线性表b*/
printf("\n\n\nInput list In increase b:(input integral end by 0)\n");
head2=CREATLIST();
/*两个链表的合并*/
printf("\n\n\nlist a:\n");
output(head1);
printf("\n\n\nlist b:\n");
output(head2);
printf("\n\nLinearlist after connect:\n");
head1=CONNECT(head1,head2);
/*遍历线性表的元素*/
output(head1);
printf("\n\n\npress any key to exit!\n");
sdmodn(head1,3);
printf("\n\n\nnew list without mod 3!\n");
output(head1);
return 0;
}
评论