1. 程式人生 > >合併兩個順序儲存結構的線性表...

合併兩個順序儲存結構的線性表...

     大二,開始上資料結構(吳蔚敏那版的)了,上課老師照著書上,感覺沒什麼用,光講演算法,也沒說具體演算法是怎麼實現的,就不聽.十一分出兩天來看看書,才發現真的還是挺難的.老師說的都是精髓,至於演算法就應該自己去安照精髓去摸索,語言學習不就是這樣麼,最後學的都是方法吧.恩,好好聽課,天天向上.大笑

     演算法:想讓lb中的元素,插入到la中,首先我們得想步驟是怎麼樣的?

              1.給la,lb插入原始的元素

              2.查詢lb中的元素

              3.和la中的比較,看是否重複,不重複,就插入,重複就不插入(好邪惡!)

              4.輸出la即可.

可以把大體思路,走一下,哪一步用到哪些函式,然後分別把各個函式實現,最後在主函式中呼叫,一氣呵成.把一個大的程式分成幾個小的部分,分別寫完測試成功,再拼接在一起.額,很難把我想的表達出來.看程式碼吧....

     程式碼:

#include<iostream>
#include <malloc.h>
#define LIST_INIT_SIZE 100
#define LISTINCREAMENT 10
#define OVERFLOW -2
#define OK 1
using namespace std;
typedef struct
{
	int *elem;
	int length;
	int listsize;
}sqlist;
//初始化連結串列
int InitList_Sq(sqlist &L)
{
	L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
	if(!L.elem) exit(OVERFLOW);
	L.length=0;
	L.listsize=LIST_INIT_SIZE;
	return OK;
}
//給連結串列增加元素
int listInsert(sqlist &L,int i,int e)
{
	int *newbase,*q,*p;
	if (i<1||i>L.length+1) return OVERFLOW;
	if(L.length>=L.listsize)
	{
		newbase=(int*)realloc(L.elem,(L.listsize+LISTINCREAMENT)*sizeof(int));
		if(!newbase) exit(OVERFLOW);
		L.elem=newbase;
		L.listsize+=LISTINCREAMENT;
	}
	q=L.elem+i-1;
	for(p=L.elem+L.length-1;p>=q;--p)
		*(p+1)=*p;										
	*q=e;
	++L.length;
	return OK;
}

//確定連結串列元素在連結串列中的位置.
int locateList(sqlist L,int e )
{
int *p,i=1;
p=L.elem;
while(i<=L.length&&e!=*p)
{
	++i;++p;
}
if(i<=L.length)
	return i;
else
	return 0;
}
//合併兩個連結串列
int unionmerge(sqlist&la,sqlist &lb)
{
	int i,e;
	for(i=1;i<=lb.length;i++)
	{
		e=*(lb.elem+i-1);
		if(!locateList(la,e))
			listInsert(la,la.length+1,e);
	}
	return OK;
}

void main()
{       //1.給la,lb插入元素
	int n,e; sqlist la;InitList_Sq(la);
	cout<<"請輸入第一個集合la中的元素個數:";
	cin>>n;
	cout<<"請輸入第一個集合la中的各個元素:";
	for(int i=1;i<=n;++i)
	{
		cin>>e;
		listInsert(la,i,e);
	}

	
	int m;sqlist lb;InitList_Sq(lb);
	cout<<"請輸入第二個集合lb中的元素個數:";
	cin>>m;
	cout<<"請輸入第二個集合lb中的各個元素:";
	for(int i=1;i<=m;++i)
	{
		cin>>e;
		listInsert(lb,i,e);
	}
        //2和3,合併la,lb,也就是將lb的元素插入到la.
	unionmerge(la,lb);
        //輸出合併的函式
	cout<<"合併後的線性表是:"<<endl;
	for(int i=1;i<=la.length;i++)
	{
		cout<<*(la.elem+i-1)<<"	";
	}
   cout<<endl;
}
有什麼不明白的可以給我留言哦...(毫無存在感啊!!!o(╯□╰)o)