導航:首頁 > 源碼編譯 > 設計演算法實現單鏈表歸並

設計演算法實現單鏈表歸並

發布時間:2022-12-25 18:09:12

Ⅰ C語言單鏈表合並

#include<stdio.h>#include<stdlib.h>structlist{intdata;structlist*next;};//兩個鏈表融合,插入排序函數voidsort(structlist*l1,structlist*l2);//輸出鏈表voidoutput(structlist*head);//輸入鏈表voidinput(structlist*head,intnum);intmain(){intn;list*h1,*h2;//兩個鏈表的頭,下面四行初始化鏈表h1=(structlist*)malloc(sizeof(structlist));h2=(structlist*)malloc(sizeof(structlist));h1->next=NULL;h2->next=NULL;//兩個鏈表輸入printf("請輸入第一個鏈表節點數: ");scanf("%d",&n);input(h1,n);printf("請輸入第二個鏈表節點數: ");scanf("%d",&n);input(h2,n);//合並鏈表並排序sort(h1,h2);//輸出合並後的鏈表output(h1);}voidinput(structlist*head,intnum){structlist*tmp;structlist*end;end=head;printf("請輸入鏈表節點: ");for(inti=0;i!=num;i++){tmp=(structlist*)malloc(sizeof(structlist));scanf("%d",&tmp->data);end->next=tmp;tmp->next=NULL;end=tmp;}}voidsort(structlist*l1,structlist*l2){structlist*p1,*p2,*tmp;p1=l1;p2=l2->next;while(p1->next&&p2){if(p1->next->data>p2->data){tmp=p2->next;p2->next=p1->next;p1->next=p2;p2=tmp;}elsep1=p1->next;}if(p2)p1->next=p2;}voidoutput(structlist*head){while(head->next){printf("%d",head->next->data);head=head->next;}}

Ⅱ 將兩個單鏈表合並為一個單鏈表

對應這個問題的演算法
voidMergeList(LinkListLa,LinkList&Lb,LinkList&Lc)
{

LinkListpa=La->next,pb=Lb->next,pc;
Lc=pc=La;
while(pa&&pb)
if(pa->data<=pb->data)
{pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{pc->next=pb;
pc=pb;
pb=pb->next;
}
pc->next=pa?pa:pb;
free(Lb);
Lb=NULL;
}
需要全部程序的話私信我

Ⅲ 已知有兩個帶頭的結點的循環單鏈表LA、LB,編寫一個演算法,將兩個循環單鏈表合並為一個循環單鏈表

已知帶有頭結點的兩個單鏈表 la 和 lb 都是非遞增有序序列。


編寫好的演算法實現將這兩個鏈表合並為新的帶有頭結點的鏈表 lc ,使得 lc 的元素仍然是非遞增有序排列的序列,如果遇到 la 與 lb 中元素相同,則只取 la 中的元素,去掉 lb 中的元素。已知 la 的元素個數 為 m , lb 的元素個數為 n。

循環單鏈表是單鏈表的另一種形式,其結構特點鏈表中最後一個結點的指針域不再是結束標記,而是指向整個鏈表的第一個結點,從而使鏈表形成一個環。和單鏈表相同,循環鏈表也有帶頭結點結構和不帶頭結點結構兩種,帶頭結點的循環單鏈表實現插入和刪除操作較為方便。

Ⅳ 編寫演算法將兩個遞增單鏈表合並成一個遞減的線性表


/*將兩個遞增單鏈表合並成一個遞減單鏈表*/

/*

演算法思想:兩個鏈表已經按元素值遞增次序排序,將其合並時,均從第一個結點起進行比較,將較小的

結點鏈入鏈表中,同時後移工作指針。由於結果鏈表是遞減的,故使用頭插法建立新鏈表。比較結束後,

可能會有一個鏈表非空,此時用頭插法將剩下的結點依次插入新鏈表中即可。

*/

void Union_List(LinkList& La,LinkList& Lb)

{

LNode *r, *pa = La->next, *pb = Lb->next; //pa,pb分別是La,Lb的工作指針

La->next = NULL; //將La作為結果鏈表的頭指針

while (pa&&pb)

{

if (pa->data <= pb->data)

{

r = pa->next; //r暫存pa的後繼結點指針

pa->next = La->next; //頭插法插入pa所指結點

La->next = pa;

pa = r;

}

else

{

r = pb->next;

pb->next = La->next;

La->next = pb;

pb = r;

}

}

while (pa) //處理剩下的結點

{

r = pa->next;

pa->next = La->next;

La->next = pa;

pa = r;

}

while (pb)

{

r = pb->next;

pb->next = La->next;

La->next = pb;

pb = r;

}

free(Lb);

}

Ⅳ 假設有兩個按元素值遞增次序排列的線性表,均以單鏈表形式存儲。請編寫演算法將這兩個單鏈表歸並為一個按元

#include "stdafx.h"
#include "iostream"
using namespace std;

struct Node

{

int num

Node *next

};

Node* Create() //
創建單鏈表

{

int n=0;

Node *p1,*p2,*head;

p1=p2=new Node;

head=NULL;

while (p1->num!=0)

{

if (n==1)

{

head=p1;

}

else

p2->next=p1;

p2=p1;

p1=new Node;

cin>>p1->num;

if(p1->num<=p2->num&&p1->num!=0)

{

cout<<"
重新輸入按遞增排序的單鏈表
:\n";

cin>>p1->num;

}

n++;

}

p2->next=NULL;

return head;

}

void Print(Node *head) //
輸出鏈表

{

Node* p=head;

while (p)

{

cout<<p->num<<" "; p=p->next;

}

cout<<endl;

}

Node *ReverseList(Node *head) //
單鏈表的逆轉

{

Node *p,*q,*r;

p=head;

q=p->next;

while (q)

{

r=q->next;

q->next=p;

p=q;

q=r;

}

head->next=NULL;

head=p;

return head;
}

Node *MergeList(Node *head1,Node *head2) //
合並單鏈表,降序

{

if(head1==NULL)

return head2;

if(head2==NULL)

return head1;

Node *head;

if(head1->num>=head2->num)

{

head=head1;

head1=head1->next;

}

else

{

head=head2;

head2=head2->next;

}

Node *temp=head;

while ( head1 != NULL && head2 != NULL)

{

if ( head1->num >= head2->num )

{

temp->next = head1

head1 = head1->next

temp =temp->next;

}

else

{

temp->next = head2;

head2 = head2->next

temp =temp->next;

}

}

if (head1 == NULL)

temp->next = head2;

if (head2 == NULL)

temp->next = head1;

return head;
}

int Count(Node *head)//
求表長

{

Node* p=head;

int i=0;

while (p)

{

i++;

p=p->next;

}

return i;
}

int main(int argc, char* argv[])
{

Node *p1,*p2;

p1,p2=new Node;

cout<<"
創建單鏈表
1,
遞增排序
,0
作為結束符!
\n";

p1=Create();

cout<<"
單鏈表
1

\n";

Print(p1);

cout<<"*********************************************\n";

cout<<"
創建單鏈表
2
,遞增排序,
0
作為結束符!
\n";

p2=Create();

cout<<"
單鏈表
2
為:
\n";

Print(p2);

cout<<"*********************************************\n";

cout<<"
合並單鏈表為(降序排列)

\n";

Node *p3;

p3=MergeList(ReverseList(p1),ReverseList(p2));

Print(p3);

cout<<"
合並單鏈表表長為
:"<<Count(p3)<<endl;

system("pause");

return 0;

Ⅵ 如何用c語言實現兩個單鏈表的歸並

函數名、變數名出現了一些C語言的關鍵字,這是不允許的(比如將union作為函數名)

Ⅶ 設計鏈表合並演算法,將兩個已排序(升序)的單鏈表,合並成一個鏈表而不改變其有序性。用c語言編寫。

#include <stdio.h>
#include <malloc.h>
typedef struct node
{
int data;
struct node *next;
}List;
List *create(List *head,int n)//創建鏈表
{
List *p,*q;
q=(List *)malloc(sizeof(List));
q->data=n;
q->next=NULL;
p=head;
while(p->next!=NULL)p=p->next;
p->next=q;
return head;
}
void print(List *head)//輸出鏈表
{
List *p;
p=head->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
List *LINK(List *head1,List *head2)//連接鏈表
{
List *p;
p=head1;
while(p->next!=NULL)p=p->next;
p->next=head2->next;
return head1;
}
main()
{
int i;
List *head1,*head2,*link1;
head1=(List *)malloc(sizeof(List));
head1->next=NULL;
head2=(List *)malloc(sizeof(List));
head2->next=NULL;
for(i=1;i<=5;i++)head1=create(head1,i);//輸入鏈表1
printf("鏈表1:\n");
print(head1);
printf("\n鏈表2:\n");
for(i=6;i<=10;i++)head2=create(head2,i);//輸入鏈表2
print(head2);
link1=LINK(head1,head2);
printf("\n連接後的鏈表:\n");
print(link1);
}

Ⅷ 求一個單鏈表歸並排序演算法,C語言的源代碼,急需!

//MergeSort.cpp

#include <iostream.h>
#include <conio.h>
#define MAXSIZE 20
#define LENGTH 7
typedef int RedType;

typedef struct //SqList structure
{ RedType r[MAXSIZE+1]; //Records Type
int length;
}SqList;
typedef SqList RcdType;

void Merge(RcdType SR,RcdType &TR,int i,int m,int n) //Merge() function
{ int j,k;
for(j=m+1,k=i;i<=m&&j<=n;++k)
{ if(SR.r[i]<=SR.r[j])
TR.r[k]=SR.r[i++];
else
TR.r[k]=SR.r[j++];
}
while(i<=m)
TR.r[k++]=SR.r[i++];
while(j<=n)
TR.r[k++]=SR.r[j++];
}//end of Merge() function

void MSort(RcdType SR,RcdType &TR1,int s, int t) //MSort() function
{ int m;
RcdType TR2;//[LENGTH];
if(s==t)
TR1.r[s]=SR.r[t];
else
{ m=(s+t)/2;
MSort(SR,TR2,s,m);
MSort(SR,TR2,m+1,t);
Merge(TR2,TR1,s,m,t);
}//end of else
}//end of MSort() function

void MergeSort(SqList &L) //MergeSort() function
{
MSort(L,L,1,L.length);
}//end of MergeSort() function

void main() //main function
{ int i;
SqList L;//={{0,49,38,65,97,76,13,27,},LENGTH};
cout<<"MergeSort.cpp"<<endl<<"============="<<endl<<endl;
cout<<"Please input the length of SqList L: <eg. 7> ";
cin>>L.length;

cout<<"Please input the disordered array L.r: <eg. {49,38,65,97,76,13,27,...}>"<<endl;
for(i=1;i<=L.length;i++)
cin>>L.r[i];
MergeSort(L);
cout<<endl<<"The sorted array L.r: ";
for(i=1;i<=L.length;i++)
cout<<L.r[i]<<" ";
cout<<endl;
cout<<"...OK!..."<<endl;
getch();
}//end of main() function我以前的,可以調試的
應該符合你要求,只是很少部分你自己改一下,比如數的個數
輸入改為 rand()隨即輸入,剛才粘貼錯了

Ⅸ 使用java設計演算法,完成將兩個有序遞增的單鏈表合並為一個有序遞增的單鏈表,重復的元素只出現一次。

type
point=^node;
node=record
data:integer;
next:point;
end;
var h1,h2,h:point;
procere prt(p:point); //列印鏈表
begin
p:=p^.next;
while p<>nil do
begin
write(p^.data,' ');
p:=p^.next;
end;
writeln;
end;
procere creat(var h:point); //建立鏈表
var x:integer; p,q:^node;
begin
writeln('請輸入升序的數,負數結束:');
new(h);
p:=h;
read(x);
while(x>=0)do
begin
new(q);
q^.data:=x;
p^.next:=q;
p:=q;
read(x);
end;
p^.next:=nil;
end;

function merge_link(var p,q:point):point; //升序合並二個升序鏈表
var h,w:^node;
begin
w:=p; p:=p^.next; dispose(w); //回收一個頭結點,p指向首個數據結點
w:=q; h:=q; q:=q^.next; //h:合並後的頭結點,q指向首個數據結點
while (p<>nil)and(q<>nil) do //當二個鏈表都不空時
if(p^.data<q^.data) then //選一個小的結點
begin
w^.next:=p; //把小結點鏈入
p:=p^.next; //跳過此結點
w:=w^.next; //w指向當前合並後鏈表的尾結點
end
else
begin //下面三行作用同上
w^.next:=q;
q:=q^.next;
w:=w^.next;
end;
if p<>nil then w^.next:=p; //將未完的鏈表接入
if q<>nil then w^.next:=q; //將未完的鏈表接入
merge_link:=h; //返回合並後的鏈表頭指針
end;
begin
creat(h1);
creat(h2);
h:=merge_link(h1,h2);
writeln('合並後的鏈表:');
prt(h);

Ⅹ 如何將兩個遞增單鏈表合並為一個遞減單鏈表,並保留原有節點。求大神給出演算法並注釋,菜鳥誠心想學習。

/*採用方法:隨機創建兩個整型數組,再把它們分別按升序排列,然後用數組元素創建兩個鏈表(升序)list1和list2。然後按要求進行合並。最後輸出合並結果,銷毀鏈表*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef int ElemType;
typedef struct LNode
{ ElemType data;
struct LNode *next;
}NODE,*PNODE, *LinkList;

/*比較函數,用於qsort排序時回調*/
int CompareInt(const void *s1, const void *s2)
{
int x= *(int *)s1;
int y= *(int *)s2;
return(x-y);
}
/*根據數組x中的n個元素排序後創建*/
LinkList CreateLst(int x[], int n)
{
if(x==NULL || n<=0) return NULL;
qsort((void *)x, n, sizeof(int), CompareInt);/*按升序排列數組x的元素*/
int i=n;
PNODE p, head=NULL;
while(i--)
{
p = (NODE *)calloc(1, sizeof(NODE));
p->data = x[i];
if(head==NULL)
{
head = p;
p->next = NULL;
}
else
{
p->next = head;
head = p; //頭插法創建鏈表
}
}
return head;
}
/*銷毀鏈表*/
void DestroyList(LinkList list)
{
if(list == NULL) return;
NODE * p=list;
while(list != NULL)
{
list = list->next;
free(p);
p = list;
}
}
/*列印鏈表*/
void printList(LinkList list)
{
while(list!=NULL)
{
printf("%d ", list->data);
list = list->next;
}
printf("\n");
return;
}
/*交換兩個鏈表的指針指向,使得list指向的鏈表表頭結點*/
void swapList(LinkList * plist1, LinkList * plist2)
{
if((plist1 == NULL) || (plist2 == NULL)) return ;
LinkList r1 = *plist1;
LinkList r2 = *plist2;
LinkList temp;
if(r1->data >=r2->data)
{
temp = *plist1;
*plist1 = *plist2;
*plist2 = temp;
}

}
/*合並遞增鏈表為遞減單鏈表並保留結點(不用創建新結點)*/
LinkList joinLists(LinkList list1, LinkList list2)
{
LinkList list3, p;

swapList(&list1, &list2);/*交換後list1指向的鏈表結點值不大於list2指向的鏈表結點值*/

list3 = list1;
list1 = list1->next;
list3->next = NULL;

while(list1!=NULL && list2 !=NULL)
{
while(list1!=NULL && (list1->data <= list2->data))
{
p = list1;
list1 = list1->next;
p->next = list3;
list3 = p;//採用頭插法
}
if(list1 == NULL ) break;
swapList(&list1, &list2);/*交換後list1指向的鏈表結點值不大於list2指向的鏈表結點值*/
}
/*把某一個沒用完的結點用頭插法插入結果鏈表*/
if(list2 == NULL)
{
while(list1 != NULL)
{
p = list1;
list1 = list1->next;
p->next = list3;
list3 = p;//採用頭插法
}
}else if(list1 == NULL)
{
while(list2 != NULL)
{
p = list2;
list2 = list2->next;
p->next = list3;
list3 = p;//採用頭插法
}
}

return list3;
}
#define M 2
#define N 4
int main()
{

int x[M], y[N];
int i=0;
LinkList list1, list2, joined;
srand(time(NULL));
while(i<M)
{
x[i++] = rand()%100;
}

i=0;
while(i<N)
{
y[i++] = rand()%100;
}
list1 = CreateLst( x, M );
list2 = CreateLst( y, N );
printf("鏈表1數據:\n");
printList(list1);
printf("鏈表2數據:\n");
printList(list2);

joined = joinLists(list1, list2);
printf("合並鏈表數據:\n");
printList(joined);

DestroyList(joined);
return 0;
}

閱讀全文

與設計演算法實現單鏈表歸並相關的資料

熱點內容
紅塔銀行app怎麼樣 瀏覽:562
農行app怎麼開網銀 瀏覽:649
java迭代器遍歷 瀏覽:301
閩政通無法請求伺服器是什麼 瀏覽:48
怎麼做積木解壓神器 瀏覽:203
王者榮耀解壓玩具抽獎 瀏覽:49
12位是由啥加密的 瀏覽:868
程序員編迷你世界代碼 瀏覽:895
php取現在時間 瀏覽:246
單片機高吸收 瀏覽:427
怎麼區分五代頭是不是加密噴頭 瀏覽:244
hunt測試伺服器是什麼意思 瀏覽:510
2013程序員考試 瀏覽:641
畢業論文是pdf 瀏覽:736
伺服器跑網心雲劃算嗎 瀏覽:471
單片機定時器計數初值的計算公式 瀏覽:801
win7控制台命令 瀏覽:567
貓咪成年app怎麼升級 瀏覽:692
360有沒有加密軟體 瀏覽:315
清除cisco交換機配置命令 瀏覽:751