- 单链表的两种创建方法:
尾插法
和头插法
- 两个数据域递增的单链表融合成一个依旧递增的单链表,很简单了
注意新链表头结点的就ok了
- 简单的很,直接看代码吧
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode;
void createLNode1(LNode *&p,int arr[],int n){//尾插法创建单链表
LNode *s,*r;
int i;
p=(LNode *)malloc(sizeof(LNode));
p->next=NULL;//头结点
r=p;
for(i=0;i<n;i++){
s=(LNode *)malloc(sizeof(LNode));
s->data=arr[i];
r->next=s;
r=s;
}
r->next=NULL;
}
void createLNode2(LNode *&p,int arr[],int n){//头插法创建单链表
LNode *s,*r;
int i;
p=(LNode *)malloc(sizeof(LNode));
p->next=NULL;
for(i=0;i<n;i++){
s=(LNode *)malloc(sizeof(LNode));
s->data=arr[i];
s->next=p->next;
p->next=s;
}
}
void printLink(LNode *p){
LNode *q;
q=p->next;
while(q!=NULL){
printf("%d ",q->data);
q=q->next;
}
}
void merge1(LNode *p,LNode *q,LNode *&l){//把p,q两链表融合成一条链表l,并保持数据域递增
LNode *r,*s,*k;
l=(LNode *)malloc(sizeof(LNode));
l->next=NULL;//头结点
k=l;
r=p->next;//指向p链表的结点指针
s=q->next;//指向q链表的结点指针
free(p);
free(q);
while(r!=NULL&&s!=NULL){
if(r->data<s->data){
k->next=r;
k=r;
r=r->next;
}else{
k->next=s;
k=s;
s=s->next;
}
}
if(r!=NULL){
k->next=r;
}
if(s!=NULL){
k->next=s;
}
}
void merge2(LNode *a,LNode *b,LNode *&c){
LNode *p,*q,*r,*s;
p=a->next;
q=b->next;
free(a);
free(b);
c=(LNode *)malloc(sizeof(LNode));
c->next=NULL;
int count1=0;
int count2=0;
while(p!=NULL&&q!=NULL){
if(p->data<q->data){
r=(LNode *)malloc(sizeof(LNode));
r->data=p->data;
r->next=c->next;
c->next=r;
p=p->next;
count1++;
}else{
r=(LNode *)malloc(sizeof(LNode));
r->data=q->data;
r->next=c->next;
c->next=r;
q=q->next;
count2++;
}
}
while(p!=NULL){
s=(LNode *)malloc(sizeof(LNode));
s->data=p->data;
s->next=c->next;
c->next=s;
p=p->next;
}
while(q!=NULL){
s=(LNode *)malloc(sizeof(LNode));
s->data=q->data;
s->next=c->next;
c->next=s;
q=q->next;
}
}
bool compare(int a,int b){
return a>b;
}
int main(int argc, char** argv) {
int arr1[]={12,2,5,46,99,95};
int arr2[]={9,87,26,45,77};
sort(arr1,arr1+6); //sort函数默认是升序. . .
sort(arr2,arr2+5,compare);//默认是升序,要想它降序则要重写compare
LNode *p,*q,*l,*c;
createLNode1(p,arr1,6);
createLNode2(q,arr2,5);//因为是头插法,所以给的数组必须是降序
printLink(p);//打印p链表
printf("\n");
printLink(q);//打印q链表
printf("\n");
// merge1(p,q,l);//把p表和q表融合成递增链表l
// printLink(l);
// printf("\n");
merge2(p,q,c);//把p表和q表融合成递减链表c
printLink(c);
printf("\n");
return 0;
}