结构体定义
typedef struct LNode
{
int data;
LNode *next;
}LNode;
尾插法建表
void createR(LNode *&L,int n)
{
LNode *r,*s;
L=(LNode*)malloc(sizeof(LNode));
r=L;
for(int i=0;i<n;i++)
{
s=(LNode*)malloc(sizeof(LNode));
scanf("%d",&s->data);
s->next=r->next;
r->next=s;
r=r->next;
}
r->next=NULL;
}
头插法建表
void createH(LNode *&L,int n)
{
L=(LNode*)malloc(sizeof(LNode));
for(int i=0;i<n;i++)
{
s=(LNode*)malloc(sizeof(LNode));
s->next=L->next;
L->next=s;
}
}
输出链表
void show(LNode &L)
{
LNode *p;
p=L->next;
while(p!=NULL)
{
printf("%d\t",p->data);
}
printf("\n");
}
链表插入结点
void insertElem(LNode *&L)
{
int e;
printf("请输入待插入的元素");
scanf("%d",&e);
LNode *s;
s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=L->next;
L->next=s;
}
链表删除结点
void delElem(LNode *&L,int e)
{
LNode *p;
int find=0;
p=L->next;
while(p!=NULL)
{
if(p->data==e)
{
p->next=p->next->next;
find=1;
}
if(find==0)
{
printf("未找到该结点");
}
p=p->next;
}
}
删除结点
void delElem(LNode *&L,int e)
{
LNode *p;
int find=0;
int location=0;
p=L->next;
while(p!=NULL)
{
location++;
if(p->data==e)
{
printf("该节点位置为第%d位",location);
}
if(find==0)
{
printf("未找到该结点");
}
p=p->next;
}
}
将两个递增的单链表合并成非递减的序列(尾插法)
void Merge(LNode *La,LNode *Lb)
{
LNode *Lc;
LNode *p=La;
LNode *q=Lb;
Lc=La;
free(Lb);//保留La头结点
LNode *r;
r=Lc;//尾指针
while(p!=NULL&&q!=NULL)//两条链表均为检查完毕
{
if(p->data<=q->data)//将较小节点插入LC
{
r->next=p;
p=p->next;
r=r->next;
}
else
{
r->next=q;
q=q->next;
r=r->next;
}
}
//将剩余结点全部尾插法插入链表
if(p!=NULL)
r->next=p;
if(q!=NULL)
r->next=q;
show(Lc);
}
将两个递增单链表合并成一个非递增链表(头插法)
void MergeB(LNode *La,LNode *Lb)
{
LNode *Lc;
LNode *p=La;
LNode *q=Lb;
LNode *s;
Lc=La;
Lc->next=NULL;
free(Lb);
while(p!=NULL&&q!=NULL)//两张表均未检查完毕
{
if(p->data<=q->data)//较小节点头插法插入新链表
{
s=p;//s用来接收新结点
s->next=Lc->next;
Lc->next=s;
p=p->next;
}
else
{
s=q;
s->next=Lc->next;
Lc->next=s;
q=q->next;
}
}
while(p!=NULL)
{
s=p;
s->next=Lc->next;
Lc->next=s;
p=p->next;
}
while(q!=NULL)
{
s=q;
s->next=Lc->next;
Lc->next=s;
q=q->next;
}
show(Lc);
}
链表逆置
void reverse(LNode *L)
{
LNode *Lb;
Lb=(LNode*)malloc(sizeof(LNode));
LNode *p;
p=L->next;
while(p!=NULL)
{
insertElemH(Lb,p->data);
p=p->next;
}
printf("逆置结果为:\n");
show(Lb);
}
应用
int main()
{
LNode *La,*Lb,*Lc;
int m,n;
printf("请输入表1长度:\t");
scanf("%d",&m);
createR(La,m);
show(La);
printf("请输入表2长度:\t");
scanf("%d",&n);
createR(Lb,n);
show(Lb);
insertElem(La,0);
show(La);
MergeB(La,Lb);
reverse(La);
return 1;
}