㈠ c語言鏈表合並:將兩個有序單向鏈表合並為一個單向有序鏈表,要求分別用兩種方式實現~急~求大神幫忙
小意思!有個前提,兩個鏈表的數據類型都是一樣的哦
第一種:先新建一個鏈表,然後遍歷第一鏈表,同時把它的值都賦給新建的鏈表,然後,開始第二個鏈表,也是同樣的辦法。加上第二個的時候,先找到新建鏈表的表尾,再表尾處開始添加第二個
第二種:首先遍歷第一個鏈表,找到表尾,然後去掉第二個鏈表的表頭,把第二個鏈表的頭部賦給第一個鏈表的尾部 //當然,如果沒有表頭什麼的就直接把第一個節點賦給第一個就行了。
第二種方法之後,兩個鏈表就合成一個了。
㈡ 如何用C語言把兩個有序線性列表合並成一個有序線性鏈表(不超過10行的程序)
#include<stdio.h>
#include <malloc.h>
#include<limits.h>
#define MAX 1024
void merge(int a[],int p,int q,int b[],int r,int s,int c[])
{int i,j,n1,n2,n,k,m;
n1=q-p+1;
n2=s-r+1;
int *l=(int *)malloc(sizeof(int)*(n1+1));
for(i=0;i<n1;i++)
l[i]=a[p+i-1];
int *t=(int *)malloc(sizeof(int)*(n2+1)); for(j=0;j<n2;j++)
t[j]=b[r+j-1];
l[n1]=INT_MAX;t[n2]=INT_MAX;
i=0;
j=0;
for(k=0;k<n1+n2;k++)
{if(l[i]<t[j]){c[k]=l[i];
i++;}
else {c[k]=t[j];
j++;}}
for(i=0;i<n1+n2;i++)
printf("%d ",c[i]);
printf("\n");
}
int main()
{
int i;
int arr[] = {4,5,9,1000,1001};
int arr2[] = {1,7,8,999,1003,1005};
int *res = (int*)malloc(sizeof(int) * 100);
merge(arr,1,5,arr2,1,6,res);
return 0;
}
㈢ 有關c語言兩個順序鏈表的合並
typedefintElementType;
typedefstructNode*PtrToNode;//定義PtrToNode為指向Node的結構體指針
structNode{
ElementTypeData;
PtrToNodeNext;
};
typedefPtrToNodeList;//定義list為指向node結構體的指針
ListMerge(ListL1,ListL2){
Listpa=L1,pb=L2,head;
Listhead=pc=(structNode*)malloc(sizzeof(structNode));
pc=(pa->Data<=pb->Data)?pa:pb;//pc指向Data較小的節點
while(pa&&pb){//循環比較L1與L2兩條鏈表的Data
if(pa->Data<pb->Data){
pc->Next=pa;
pc=pc->Next;
pa=pa->Next;
}
else{
pc->Next=pb;
pc=pc->Next;
pb=pb->Next;
}
}
while(pa){pc->Next=pa;pc=pc->Next;pa=pa->Next;}//將剩餘的鏈表接到pc後面
while(pb){pc->Next=pb;pc=pc->Next;pb=pb->Next;}
printf("ListMergeisavailable!");
returnhead;
}
㈣ C語言編程題輸入兩個有序循環鏈表合成一個有序循環鏈表
有好幾處錯誤和遺漏,幫你改了,你看下:
#include<stdio.h>
#include<stdlib.h>
#defineNULL0
structnode
{
intData;
structnode*next;
};
main()
{
structnode*p1,*q1,*head1;
structnode*p2,*q2,*head2;
structnode*p3,*q3,*head3;
intx,i;
p1=q1=head1=p2=q2=head2=p3=q3=head3=NULL;
scanf("%d",&x);
while(x!=-1)
{
p1=(structnode*)malloc(sizeof(structnode));
p1->Data=x;
if(q1==NULL)
{
q1=p1;
q1->next=NULL;
head1=p1;
}
if(q1!=NULL)
{
q1->next=p1;
q1=p1;
}
scanf("%d",&x);
}
p1->next=NULL;
scanf("%d",&i);
while(i!=-1)
{
p2=(structnode*)malloc(sizeof(structnode));
p2->Data=i;
if(q2==NULL)
{
q2=p2;
q2->next=NULL;
head2=p2;
}
if(q2!=NULL)
{
q2->next=p2;
q2=p2;
}
scanf("%d",&i);
}
p2->next=NULL;
p1=head1;
p2=head2;
p3=(structnode*)malloc(sizeof(structnode));
q3=head3=p3;
while(p1!=NULL&&p2!=NULL)
{
if(p1->Data<p2->Data)
{
//q3->Data=p1->Data;
q3->next=p1;
q3=p1;
p1=p1->next;
}
else
{
//q3->Data=p2->Data;
q3->next=p2;
q3=p2;
p2=p2->next;
}
if(p1==NULL)
q3->next=p2;
if(p2==NULL)
q3->next=p1;
}
if(q3!=NULL)q3->next=NULL;
p3=head3->next;
while(p3!=NULL)
{
printf("%d",p3->Data);
p3=p3->next;
}
}
㈤ c++將兩個有序鏈表合並為一個有序鏈表
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
class Node
{
public:
Node()
{
next=NULL;
}
Node(int d):data(d)
{
next=NULL;
}
~Node()
{
if(next)
delete next;
}
int data;
Node *next;
};
class List
{
public:
List()
{
first=NULL;
}
~List()
{
delete first;
cout<<endl;
}
void InitList(int len,int min,int max)
{
int i,data;
Node *tail,*pnew;
data=rand()%(max-min+1)+min;
this->first=tail=new Node(data);
for(i=1;i<len;i++)
{
data=rand()%(max-min+1)+min;
pnew=new Node(data);
tail->next=pnew;
tail=pnew;
}
}
void OutputList() const
{
Node *p=first;
while(p)
{
cout<<p->data;
cout<<(p->next ? "->" : "\n");
p=p->next;
}
}
Node *first;
};
//將數組lists中的len個鏈表合並到lst中
//asc為true按升序合並,false按降序合並
//不要求lists中的各鏈表是有序的
//合並後,不會改變lists中的各原鏈表
void MergeList(List &lst,bool asc,List lists[],int len)
{
int i;
Node *p,*q,*pnext,*pnew=NULL;
lst.first=NULL;
for(i=0;i<len;i++)
{
pnext=lists[i].first;
while(pnext)
{
pnew=new Node();
pnew->next=NULL;
pnew->data=pnext->data;
if(!lst.first)
lst.first=pnew;
else
{
q=NULL;
p=lst.first;
while(p)
{
if((asc && pnew->data<p->data)||
(!asc && pnew->data>p->data))
{
pnew->next=p;
if(!q)
lst.first=pnew;
else
q->next=pnew;
break;
}
q=p;
p=p->next;
}
if(!p)
q->next=pnew;
}
pnext=pnext->next;
}
}
}
int main()
{
//鏈表節點可取的最小值,最大值,最小鏈表節點數量,最大鏈表節點數量
int const MinValue=1,MaxValue=1000,MinLen=2,MaxLen=25;
//最小鏈表數量,最大鏈表數量
int const MinListCount=2,MaxListCount=8;
List lst1,lst2,*lists;
int i,c,len;
srand(time(NULL));
c=rand()%(MaxListCount-MinListCount+1)+MinListCount;
lists=new List[c];
cout<<"合並前,各鏈表:"<<endl;
for(i=0;i<c;i++)
{
len=rand()%(MaxLen-MinLen+1)+MinLen;
lists[i].InitList(len,MinValue,MaxValue);
cout<<"list "<<(i+1)<<endl;
lists[i].OutputList();
}
cout<<endl<<endl;
MergeList(lst1,true,lists,c);
MergeList(lst2,false,lists,c);
cout<<"合並後,各鏈表(不變):"<<endl;
for(i=0;i<c;i++)
{
cout<<"list "<<(i+1)<<":"<<endl;
lists[i].OutputList();
}
cout<<endl<<endl;
cout<<"按升序合並後:"<<endl;
lst1.OutputList();
cout<<"按降序合並後:"<<endl;
lst2.OutputList();
delete [] lists;
return 0;
}
㈥ 求指導!C語言實現兩個有序鏈表合並並輸出。
二路歸並啊 你思路是正確的
while(pa && pb){ //這句之前,你要pa=pa->next;pb=pb->next,因為兩個都有一個頭結點不需要比較
其餘的沒看出什麼問題來
補充:早點貼出圖來。。。幫你修改好了
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *link;
}NODE,* LinkList;
//建立單鏈表
LinkList Create_Node(){
LinkList head,p,pre;
pre = head = (LinkList) malloc(sizeof(NODE));
pre->link = NULL;
int a;
while((scanf("%d",&a)) != EOF){
p = (LinkList) malloc(sizeof(NODE));
p->data = a;
p->link = NULL;
pre->link = p;
pre = pre->link;
}
return head;
}
//合並兩個有序鏈表
LinkList MergeList_L(){
LinkList pa,pb,pc,head;
pa = Create_Node();
pb = Create_Node();
head = pc = (LinkList)malloc(sizeof(NODE));
pc->link = NULL;
pa=pa->link;//不比較頭結點
pb=pb->link;
while(pa && pb){
if(pa->data <= pb->data){
if(pa->data!=pc->data)//加個判斷,是否跟上一個元素相同
{
pc->link = pa; pc = pa; //用La的頭結點作為Lc的頭結點
}
pa=pa->link;
}
else{
if(pb->data!=pc->data)
{
pc->link = pb; pc = pb;
}
pb = pb->link;
}
}
//pc->link = pa ? pa : pb; //插入剩餘段
while(pa)
{
if(pc->data!=pa->data)
{
pc->link=pa;
pc=pa;
}
pa=pa->link;
}
while(pb)
{
if(pc->data!=pb->data)
{
pc->link=pb;
pc=pb;
}
pb=pb->link;
}
return head;
}
//依次列印鏈表中的每個值
int Print_L(LinkList head){
LinkList p;
p = head->link;
printf("%d",p->data);
p = p->link;
do{
printf(" %d",p->data);
p = p->link;
} while(p->link != NULL);
printf(" %d",p->data);
system("pause");
return 0;
}
int main(){
LinkList Lc;
Lc = MergeList_L();
Print_L(Lc);
return 0;
}
㈦ C語言 把兩個有序鏈表合並為一個有序鏈表(遞增)
設鏈表結點結構為Node(int data, Node *next),typedef Node List,鏈表均帶表頭結點。
思路是:把list1中的元素看成是集合1,把list2中的元素看成是集合2,把list1頭結點(即list1結點)從集合1中脫離下來看成是目標集合的頭結點,目標集合開始時是空集,並用last指針始終指向該集合的尾部,然後每次從集合1和集合2中取各自的第一個元素進行比較,較小者從相應集合里脫離,插入到目標集合list1的尾部即last的末尾,並將剛插入的元素作為目標集合list1的新的last,直到集合1為空或集合2為空時結束,最後將未空的集合中的剩餘元素鏈接到last後面即可。
㈧ c語言,如何使兩個鏈表合並,求解答
void test(LNodeL *head1,Node *head2)//將表頭為head2的鏈表合並到head1
{
LNode *p1 = head1;
while(p1->next != NULL)
{
p1 = p1->next;
}
p->next = head2;
}
這樣就可以。
㈨ 請用演算法寫出兩個有序表合並成一個有序線性表(用C語言
#include "stdio.h" main() { int a,b,c,i,j,k,low,high,mid; int la[50]; int lb[50]; int lc[50]; printf("Please input the width of la,lb,lc:\n"); printf("Input here:"); scanf("%d,%d,%d",&a,&b,&c); printf("a=%d,b=%d,c=%d\n",a,b,c); if (a+b>c) printf("lc overflow,operation halt!\n"); else { printf("Input la:"); for(i=1;i<=a;++i) { scanf("%d",&la[i]); la[0]=la[i]; low=1; high=i; while(low<=high) { mid=(low+high)/2; if(la[0]=low;j--) la[j+1]=la[j]; la[low]=la[0]; } printf("\n"); printf("Input lb:"); for(i=1;i<=b;++i) { scanf("%d",&lb[i]); lb[0]=lb[i]; low=1; high=i; while(low<=high) { mid=(low+high)/2; if(lb[0]=low;j--) lb[j+1]=lb[j]; lb[low]=lb[0]; } printf("\n"); printf("la is:"); for (i=1;i<=a;i++) printf("%d ",la[i]); printf("\n"); printf("lb is:"); for (j=1;j<=b;j++) printf("%d ",lb[j]); i=1;j=1;k=0; while (i<=a && j<=b) if (la[i]>lb[j]) { lc[k]=lb[j];k++;j++;} else { lc[k]=la[i];k++;i++;} while (i<=a) {lc[k]=la[i];k++;i++;} while (j<=b) {lc[k]=lb[j];k++;j++;} printf("\n"); printf("lc is:"); for (i=0;i } getch(); } 把la,lb,lc分別換一下就OK了
希望採納