1. 程式人生 > >鏈表的相關算法及應用(三)

鏈表的相關算法及應用(三)

klist pri 去除 lse mon 原來 null code ...

問題六 :將兩個單鏈表的相同的值,組成一個新的鏈表

問題七 :遞增輸出單鏈表 並釋放節點

問題八 :將一個帶頭結點的單鏈表A 分解為兩個帶頭結點的單鏈表A和B使A中保存原來序號為奇數的元素,B中保存原來序號為偶數的元素

問題九 :將C={a1,b1,a2,b2,...,an,bn},拆分為 A={a1,a2,...,an} B={b1,b2,...,bn};

問題十 :去除遞增有序鏈表中的重復元素

//問題六 將兩個單鏈表的相同的值,組成一個新的鏈表 
LinkList common(LinkList L1,LinkList L2){
LNode *t1=L1->next,*t2=L2->next;
bool yes = 0; LNode *h = (LNode*)malloc(sizeof(LNode)); h->next=NULL; while(t1){ yes=0; t2=L2->next; while(t2){ if(t1->data==t2->data){ yes=1; break; } t2=t2->next; } if(yes){ LNode *node = (LNode*)malloc(sizeof(LNode)); node->data=t1->data; node->next=h->next; h->next = node; } t1
=t1->next; } return h; }

//問題七 遞增輸出單鏈表 並釋放節點
void min_del(LinkList &L){
LNode *pre=L,*p=L->next,*t;
while(L->next!=NULL){
pre=L;
p=L->next;
while(p->next!=NULL){
if(p->next->data<pre->next->data){
pre=p;
}
p=p->next;
}
t=pre->next;
printf("%d ",t->data);
pre
->next=t->next; free(t); } free(L); }

//問題八 將一個帶頭結點的單鏈表A 分解為兩個帶頭結點的單鏈表A和B
//    使A中保存原來序號為奇數的元素,B中保存原來序號為偶數的元素
LinkList disCreate(LinkList &A){
LinkList B = (LinkList)malloc(sizeof(LNode));
B->next=NULL;
LNode *a=A,*b=B;
LNode *r,*p=A->next;
int index = 1;
while(p!=NULL){
if(index%2){
a->next=p;
a=p;
}else{
b->next=p;
b=p;
}
index++;
p=p->next;
}
a->next=NULL;
b->next=NULL;

return B;
}

//問題九 將C={a1,b1,a2,b2,...,an,bn},拆分為 A={a1,a2,...,an} B={b1,b2,...,bn}; 
LinkList disCreate2(LinkList &A){
LinkList B = (LinkList)malloc(sizeof(LNode));
B->next=NULL;
LNode *r,*a=A;
int index = 1;
LNode *p = A->next;
while(p!=NULL){
r=p->next;
if(index%2){
a->next=p;
a=p;
}else{
p->next=B->next;
B->next=p;

}
p=r;
index++;
}
a->next=NULL;
return B;    
}

//問題十 去除遞增有序鏈表中的重復元素 
void moveRepeat(LinkList &L){
LNode *pre=L,*p=L->next;
while(p!=NULL){
if(p->next!=NULL){
if(p->data!=p->next->data){
pre->next=p;
pre=p;
}
}else{
pre->next=p;
pre=p;
}
p=p->next;
}
pre->next=NULL;
}

鏈表的相關算法及應用(三)