【數據結構】線性表的應用

問題描述

  • 問題: 假設有兩個表A和B,分別是m1行、n1列和m2行、n2列,它們簡單自然連接結果C=AxB(i=j),其中i表示表A中列號,j表示表B中的列號,C爲A和B的笛卡兒積中滿足指定連接條件的所有記錄組,該連接條件爲表A的第i列與表B的第j列相等

在這裏插入圖片描述

  • 什麼是笛卡爾積?
    設A,B爲集合,用A中元素爲第一元素,B中元素爲第二元素構成有序對,所有這樣的有序對組成的集合叫做A與B的笛卡爾積,記作AxB.
    例如,A={a,b}, B={0,1,2},則
    A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
    B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}
    拿題目當例子就是,不考慮 i=j 就是笛卡爾積
  • 也就是C=AxB={ (1,2,3,3,5),(1,2,3,1,6),(1,2,3,3,4),(2,3,3,3,5),(2,3,3,1,6),(2,3,3,3,4),(1,1,1,3,5),(1,1,1,1,6),(1,1,1,3,4) }
  • 取C中集合的第3列和第4列相同的元素組成一個大集合
    在這裏插入圖片描述

數據結構定義

  • 由於每個表的行列數都不確定,由連接條件可知要求元素每行可以隨機存取,因此採用如下結構
#define MAX_COL 10

typedef struct RowHeadNode
{
	int a[MAX_COL];
	struct RowHeadNode* next;
}RowHeadNode;

typedef struct MaxtriHeadNode
{
	int row, col;
	RowHeadNode* next;
}MaxtriHeadNode;

基本操作算法

//建表
MaxtriHeadNode*  CreateTable()
{
	int row = 0;
	int col = 0;
	MaxtriHeadNode* h = (MaxtriHeadNode*)malloc(sizeof(MaxtriHeadNode));
	h->next = NULL;
	RowHeadNode* r = h ->next;
	printf("Please input the row num: ");
	scanf("%d", &h->row);
	printf("Please input the col num: ");
	scanf("%d", &h->col);
	for (row = 0; row < h->row; row++)
	{
		RowHeadNode* s = (RowHeadNode*)malloc(sizeof(RowHeadNode));
		printf("Please input the %d row,%d data : \n", row + 1,h->col);
		
		for (col = 0; col < h->col; col++)
		{
			scanf("%d", &s->a[col]);
		}
		if (!h->next) h->next = s;
		else r ->next= s;
		r = s;
	}
	r->next = NULL;
	return h;
}

//顯示
void DispTable(MaxtriHeadNode* h)
{
	RowHeadNode* p = h->next;
	printf("**********************************\n");
	while (p)
	{
		for (int i = 0; i < h->col; i++)
			printf("\t%d", p->a[i]);
		printf("\n");
		p = p->next;
	}
	printf("**********************************\n");
}
 
// 摧毀
void DestroyTable(MaxtriHeadNode* h)
{
	RowHeadNode* pre = h->next;
	RowHeadNode* p = h->next->next;
	while (p)
	{
		free(pre);
		pre = p;
		p = p->next;
	}
	free(pre);
	free(h);
}

主要流程

MaxtriHeadNode* LinkTable(MaxtriHeadNode* h1, int h1_i,MaxtriHeadNode* h2,int h2_i)
{
	int row = 0;
	int col = h1->col + h2->col;
	RowHeadNode* p1 = h1->next;
	RowHeadNode* p2 = h2->next;
	RowHeadNode* t;
	MaxtriHeadNode* head = (MaxtriHeadNode*)malloc(sizeof(MaxtriHeadNode));
	head->next = NULL;	
	RowHeadNode* r= head->next;
	while (p1)
	{
		while (p2)
		{
			if ((p1->a[h1_i - 1]) == (p2->a[h2_i - 1]))
			{
				t = (RowHeadNode*)malloc(sizeof(RowHeadNode));
				//以下兩行存在bug,memcpy時字節數過大;會導致堆被破壞
				//注意檢查實際memcpy的空間,過大時容易佔用到未分配的空間,然後malloc時會提示堆被破壞;
				//memcpy(t->a, p1->a, h1->col * sizeof(p1->a));
				//memcpy(&t->a[h1->col], p2->a, h2->col * sizeof(p1->a));  
				for (int idata = 0; idata < h1->col; idata++)
					t->a[idata] = p1->a[idata];
				for (int idata = 0; idata < h2->col; idata++)
					t->a[idata+h1->col] = p2->a[idata];
				if (!head->next)  head->next = t;
				else  r->next = t;
				r = t;
				row++;
			}
			p2 = p2->next;
		}
		p2 = h2->next;
		p1 = p1->next;
	}
	r->next = NULL;
	head->col = col;
	head->row = row;
	return head;
}

運行程序

int main()
{
	MaxtriHeadNode* pMaxt1 = CreateTable();
	MaxtriHeadNode* pMaxt2 = CreateTable();
	DispTable(pMaxt1);
	DispTable(pMaxt2);
	pMaxt1=LinkTable(pMaxt1,3, pMaxt2,1);
	DispTable(pMaxt1);
	DestroyTable(pMaxt1);
	DestroyTable(pMaxt2);
	getch();
	return 0;
}

運行結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章