#include <stdio.h>
#include <stdlib.h>
#include"csl210_lab1.h"
nodeQ_t *convertSparseMatrixToLinkedList(unsigned short **matrix, unsigned short rows, unsigned short columns)
{
  nodeQ_t *head;
  head = (nodeQ_t *)malloc(sizeof(nodeQ_t));
  head->value = 0;
  head->row = rows;
  head->column = columns;
  head->next = EMPTYNODE;
  nodeQ_t *tem = head->next;
  for (int j = 0; j < rows; j++)
  {
    for (int i = 0; i < columns; i++)
    {
      if (matrix[j][i] != 0)
      {
        if (tem == EMPTYNODE)
        {
         // printf("a\t");
          tem = (nodeQ_t *)malloc(sizeof(nodeQ_t));
          tem->row = j;
          tem->column = i;
          tem->value = matrix[j][i];
          tem->next = EMPTYNODE;
          head->next = tem;
        }
        else
        {
          while (tem->next != EMPTYNODE)
          {
           // printf("a\t");
            tem = tem->next;
          }
          nodeQ_t *new_node = EMPTYNODE;
          new_node = (nodeQ_t *)malloc(sizeof(nodeQ_t));
          new_node->row = j;
          new_node->column = i;
          new_node->value = matrix[j][i];
          new_node->next = EMPTYNODE;
          tem->next = new_node;
        }
      }
    }
  }
  return head;
}
nodeQ_t *multiplySparseMatricesLinkedLists(nodeQ_t *matrix_llist_1, nodeQ_t *matrix_llist_2)
{
  nodeQ_t *temp = matrix_llist_1;
  nodeQ_t *temp2 = matrix_llist_2;
  if (temp->column != temp2->row)
    return 0;
  nodeQ_t *head;
  head = (nodeQ_t *)malloc(sizeof(nodeQ_t));
  head->row = temp->row;
  head->value = 0;
  head->column = temp2->column;
  head->next = EMPTYNODE;
  nodeQ_t *tem = head->next;
  temp2 = matrix_llist_2->next;
  temp = matrix_llist_1->next;
  while (1)
  {
    temp2 = matrix_llist_2;
    while (1)
    {
      if (temp->column == temp2->row)
      {
        int flag1 = 0, flag3 = 0;
        temp = head->next;
        if (temp != EMPTYNODE)
        {
          while (1)
          {
            if (temp->row == temp->row && temp->column == temp2->column)
            {
              flag1 = 1;
              temp->value += (temp->value) * (temp2->value);
            }
            if (temp->next == EMPTYNODE)
            {
              break;
            }
            temp = temp->next;
          }
        }
        if (flag1 == 0)
        {
          if (temp == EMPTYNODE)
          {
            temp = (nodeQ_t *)malloc(sizeof(nodeQ_t));
            temp->row = temp->row;
            temp->column = temp2->column;
            temp->value = (temp->value) * (temp2->value);
            temp->next = EMPTYNODE;
            head->next = temp;
          }
          else
          {
            nodeQ_t *new_node = EMPTYNODE;
            new_node = (nodeQ_t *)malloc(sizeof(nodeQ_t));
            new_node->row = temp->row;
            new_node->column = temp2->column;
            new_node->value = temp->value * temp2->value;
            new_node->next = EMPTYNODE;
            temp->next = new_node;
          }
        }
      }
      if (temp2->next == EMPTYNODE)
      {
        break;
      }
      temp2 = temp2->next;
    }
    if (temp->next == EMPTYNODE)
    {
      break;
    }
    temp = temp->next;
  }
  return head;
}
//---------------------------------------------------------------------------------------
void insertPriorityHashTable(priorityNodeQ_t *item)
{
  unsigned short hashKey = hashFuncLab1(item->value);
  priorityNodeQ_t *temp = g_priorityHashTable[hashKey];
  priorityNodeQ_t *temp2 = EMPTYNODE;
  if (EMPTYNODE == g_priorityHashTable[hashKey])
  {
    g_priorityHashTable[hashKey] = item;
  }
  else
  {
    while (temp != EMPTYNODE && temp->priority <= item->priority)
    {
      temp2 = temp;
      temp = temp->next;
    }
    if (temp == g_priorityHashTable[hashKey])
    {
      item->next = g_priorityHashTable[hashKey];
      g_priorityHashTable[hashKey] = item;
    }
    else
    {
      item->next = temp2->next;
      temp2->next = item;
    }
  }
}
priorityNodeQ_t *dequeueFromPriorityHashTable(unsigned short key)
{
  unsigned short hashKey = hashFuncLab1(key);
  if (g_priorityHashTable[hashKey] == EMPTYNODE)
    return 0;
  priorityNodeQ_t *temp1 = g_priorityHashTable[hashKey];
  g_priorityHashTable[hashKey] = g_priorityHashTable[hashKey]->next;
  return temp1;
}
   //************************** MAIN FUNCTION******************************//
void printTable(){
	for(int i=0;i<SIZE_HASH_TABLE;i++){
		priorityNodeQ_t* temp = g_priorityHashTable[i];
		printf("[%d] -> ",i);
		while(temp){
			printf("(v:%d,p:%d) -> ",temp->value,temp->priority);
			temp = temp->next;
		}
		printf("NULL\n");
	}
}
void printlist(nodeQ_t *head)
{
  nodeQ_t *temp = head;
  while (temp != EMPTYNODE)
  {
    printf("v:%d\tr:%d\tc:%d\t\n", temp->value, temp->row, temp->column);
    temp = temp->next;
  }
}
int main(){
	unsigned short row=0,column=0;
	
	// arr1 m1 3x3
	
	row=3; column=3;
	unsigned short ** arr1 = (unsigned short **)malloc(row * sizeof(unsigned short));
	for (int r = 0; r < row; r++){
		arr1[r] = (unsigned short *)malloc(column * sizeof(unsigned short));
	}
	for(int i=0;i<row;i++){
		for(int j=0;j<column;j++){
			arr1[i][j]=0;
		}
	}
	arr1[0][1]=1;
	arr1[1][0]=2;
	arr1[1][2]=2;
	arr1[2][1]=1;
	arr1[2][2]=3;
	for(int i=0;i<row;i++){
		for(int j=0;j<column;j++){
			printf("%d ",arr1[i][j]);
		}
		printf("\n");
	}
	nodeQ_t* m1=convertSparseMatrixToLinkedList(arr1,row,column);
	printlist(m1);
	printf("\n");
	//------------
	
	// arr2 m2 3x3
	row=3; column=3;
	unsigned short ** arr2 = (unsigned short **)malloc(row * sizeof(unsigned short));
	for (int r = 0; r < row; r++){
		arr2[r] = (unsigned short *)malloc(column * sizeof(unsigned short));
	}
	for(int i=0;i<row;i++){
		for(int j=0;j<column;j++){
			arr2[i][j]=0;
		}
	}
	arr2[0][0]=2;
	arr2[1][1]=2;
	arr2[2][0]=2;
	arr2[2][2]=2;
	for(int i=0;i<row;i++){
		for(int j=0;j<column;j++){
			printf("%d ",arr2[i][j]);
		}
		printf("\n");
	}
	nodeQ_t* m2=convertSparseMatrixToLinkedList(arr2,row,column);
	printlist(m2);	
	printf("\n");
	
	//------------
	
	// arr3 m3 3x1
	row=3; column=1;
	unsigned short ** arr3 = (unsigned short **)malloc(row * sizeof(unsigned short));
	for (int r = 0; r < row; r++){
		arr3[r] = (unsigned short *)malloc(column * sizeof(unsigned short));
	}
	for(int i=0;i<row;i++){
		for(int j=0;j<column;j++){
			arr3[i][j]=0;
		}
	}
	arr3[0][0]=1;
	arr3[2][0]=3;
	for(int i=0;i<row;i++){
		for(int j=0;j<column;j++){
			printf("%d ",arr3[i][j]);
		}
		printf("\n");
	}
	nodeQ_t* m3=convertSparseMatrixToLinkedList(arr3,row,column);
	printlist(m3);
	printf("\n");
	//------------
	
	// arr4 m4 1x3
	row=1; column=3;
	unsigned short ** arr4 = (unsigned short **)malloc(row * sizeof(unsigned short));
	for (int r = 0; r < row; r++){
		arr4[r] = (unsigned short *)malloc(column * sizeof(unsigned short));
	}
	for(int i=0;i<row;i++){
		for(int j=0;j<column;j++){
			arr4[i][j]=0;
		}
	}
	arr4[0][1]=2;
	arr4[0][2]=1;
	for(int i=0;i<row;i++){
		for(int j=0;j<column;j++){
			printf("%d ",arr4[i][j]);
		}
		printf("\n");
	}
	nodeQ_t* m4=convertSparseMatrixToLinkedList(arr4,row,column);
	printlist(m4);
	printf("\n");
	//------------
	
	// arr5 m5 3x4
	row=3; column=4;
	unsigned short ** arr5 = (unsigned short **)malloc(row * sizeof(unsigned short));
	for (int r = 0; r < row; r++){
		arr5[r] = (unsigned short *)malloc(column * sizeof(unsigned short));
	}
	for(int i=0;i<row;i++){
		for(int j=0;j<column;j++){
			arr5[i][j]=0;
		}
	}
	arr5[0][3]=1;
	arr5[1][0]=2;
	arr5[1][2]=4;
	arr5[2][3]=3;
	for(int i=0;i<row;i++){
		for(int j=0;j<column;j++){
			printf("%d ",arr5[i][j]);
		}
		printf("\n");
	}
	nodeQ_t* m5=convertSparseMatrixToLinkedList(arr5,row,column);
	printlist(m5);
	printf("\n");
	//------------
	
	// arr6 m6 4x3
	row=4; column=3;
	unsigned short ** arr6 = (unsigned short **)malloc(row * sizeof(unsigned short));
	for (int r = 0; r < row; r++){
		arr6[r] = (unsigned short *)malloc(column * sizeof(unsigned short));
	}
	for(int i=0;i<row;i++){
		for(int j=0;j<column;j++){
			arr6[i][j]=0;
		}
	}
	arr6[0][1]=4;
	arr6[1][0]=1;
	arr6[1][2]=5;
	arr6[2][2]=6;
	arr6[3][0]=1;
	for(int i=0;i<row;i++){
		for(int j=0;j<column;j++){
			printf("%d ",arr6[i][j]);
		}
		printf("\n");
	}
	nodeQ_t* m6=convertSparseMatrixToLinkedList(arr6,row,column);
	printlist(m6);
	printf("\n");
	//------------
	
	// mul1=m1 x m2 [3x3:3x3]==3x3
	nodeQ_t* mul1 = multiplySparseMatricesLinkedLists(m1,m2);
	printlist(mul1);
	printf("\n");
	// mul2=m2 x m3 [3x3:3x1]==3x1
	nodeQ_t* mul2 = multiplySparseMatricesLinkedLists(m2,m3);
	printlist(mul2);
	printf("\n");
	// mul3=m3 x m4 [3x1:1x3]==3x3
	nodeQ_t* mul3 = multiplySparseMatricesLinkedLists(m3,m4);
	printlist(mul3);
	printf("\n");
	// mul4=m4 x m3 [1x3:3x1]==1x1
	nodeQ_t* mul4 = multiplySparseMatricesLinkedLists(m4,m3);
	printlist(mul4);
	printf("\n");
	// mul5=m1 x m5 [3x3:3x4]==3x4
	nodeQ_t* mul5 = multiplySparseMatricesLinkedLists(m1,m5);
	printlist(mul5);
	printf("\n");
	// mul6=m5 x m6 [3x4:4x3]==3x3
	nodeQ_t* mul6 = multiplySparseMatricesLinkedLists(m5,m6);
	printlist(mul6);
	printf("\n");
	// mul7=m6 x m5 [4x3:3x4]==4x4
	nodeQ_t* mul7 = multiplySparseMatricesLinkedLists(m6,m5);
	printlist(mul7);
	printf("\n");
	// [0] v=0 p=2
	priorityNodeQ_t* temp=NULL;
    temp = (priorityNodeQ_t*)malloc(sizeof(priorityNodeQ_t));
    temp->next=EMPTYNODE;
    temp->value=0;
    temp->priority=2;
	insertPriorityHashTable(temp);
	printTable();
	printf("\n");
	// [0] v=10 p=5
	priorityNodeQ_t* temp1=NULL;
    temp1 = (priorityNodeQ_t*)malloc(sizeof(priorityNodeQ_t));
    temp1->next=EMPTYNODE;
    temp1->value=10;
    temp1->priority=5;
	insertPriorityHashTable(temp1);
	printTable();
	printf("\n");
	// [0] v=5 p=1
	priorityNodeQ_t* temp2=NULL;
    temp2 = (priorityNodeQ_t*)malloc(sizeof(priorityNodeQ_t));
    temp2->next=EMPTYNODE;
    temp2->value=5;
    temp2->priority=1;
	insertPriorityHashTable(temp2);
	printTable();
	printf("\n");
	// [0] v=15 p=5
	priorityNodeQ_t* temp3=NULL;
    temp3 = (priorityNodeQ_t*)malloc(sizeof(priorityNodeQ_t));
    temp3->next=EMPTYNODE;
    temp3->value=15;
    temp3->priority=5;
	insertPriorityHashTable(temp3);
	printTable();
	printf("\n");
	// [0] v=105 p=5
	priorityNodeQ_t* temp4=NULL;
    temp4 = (priorityNodeQ_t*)malloc(sizeof(priorityNodeQ_t));
    temp4->next=EMPTYNODE;
    temp4->value=105;
    temp4->priority=5;
	insertPriorityHashTable(temp4);
	printTable();
	printf("\n");
	// [1] v=1 p=1
	priorityNodeQ_t* temp5=NULL;
    temp5 = (priorityNodeQ_t*)malloc(sizeof(priorityNodeQ_t));
    temp5->next=EMPTYNODE;
    temp5->value=1;
    temp5->priority=1;
	insertPriorityHashTable(temp5);
	printTable();
	printf("\n");	
	// [1] v=11 p=2
	priorityNodeQ_t* temp6=NULL;
    temp6 = (priorityNodeQ_t*)malloc(sizeof(priorityNodeQ_t));
    temp6->next=EMPTYNODE;
    temp6->value=11;
    temp6->priority=2;
	insertPriorityHashTable(temp6);
	printTable();
	printf("\n");	
	// [1] v=21 p=1
	priorityNodeQ_t* temp7=NULL;
    temp7 = (priorityNodeQ_t*)malloc(sizeof(priorityNodeQ_t));
    temp7->next=EMPTYNODE;
    temp7->value=21;
    temp7->priority=1;
	insertPriorityHashTable(temp7);
	printTable();
	printf("\n");	
	// [1] v=31 p=4
	priorityNodeQ_t* temp8=NULL;
    temp8 = (priorityNodeQ_t*)malloc(sizeof(priorityNodeQ_t));
    temp8->next=EMPTYNODE;
    temp8->value=31;
    temp8->priority=4;
	insertPriorityHashTable(temp8);
	printTable();
	printf("\n");	
	// [1] v=6 p=3
	priorityNodeQ_t* temp9=NULL;
    temp9 = (priorityNodeQ_t*)malloc(sizeof(priorityNodeQ_t));
    temp9->next=EMPTYNODE;
    temp9->value=6;
    temp9->priority=3;
	insertPriorityHashTable(temp9);
	printTable();
	printf("\n");	
	// [1] v=16 p=1
	priorityNodeQ_t* temp0=NULL;
    temp0 = (priorityNodeQ_t*)malloc(sizeof(priorityNodeQ_t));
    temp0->next=EMPTYNODE;
    temp0->value=16;
    temp0->priority=1;
	insertPriorityHashTable(temp0);
	printTable();
	printf("\n");
	// [3] v=3 p=3
	priorityNodeQ_t* temp10=NULL;
    temp10 = (priorityNodeQ_t*)malloc(sizeof(priorityNodeQ_t));
    temp10->next=EMPTYNODE;
    temp10->value=3;
    temp10->priority=3;
	insertPriorityHashTable(temp10);
	printTable();
	printf("\n");	
	// [3] v=8 p=5
	priorityNodeQ_t* temp20=NULL;
    temp20 = (priorityNodeQ_t*)malloc(sizeof(priorityNodeQ_t));
    temp20->next=EMPTYNODE;
    temp20->value=8;
    temp20->priority=5;
	insertPriorityHashTable(temp20);
	printTable();
	printf("\n");
	// [3] v=13 p=3
	priorityNodeQ_t* temp30=NULL;
    temp30 = (priorityNodeQ_t*)malloc(sizeof(priorityNodeQ_t));
    temp30->next=EMPTYNODE;
    temp30->value=13;
    temp30->priority=3;
	insertPriorityHashTable(temp30);
	printTable();
	printf("\n");	
	// [3] v=18 p=3
	priorityNodeQ_t* temp40=NULL;
    temp40 = (priorityNodeQ_t*)malloc(sizeof(priorityNodeQ_t));
    temp40->next=EMPTYNODE;
    temp40->value=18;
    temp40->priority=3;
	insertPriorityHashTable(temp40);
	printTable();
	printf("\n");	
	// [3] v=23 p=2
	priorityNodeQ_t* temp50=NULL;
    temp50 = (priorityNodeQ_t*)malloc(sizeof(priorityNodeQ_t));
    temp50->next=EMPTYNODE;
    temp50->value=23;
    temp50->priority=2;
	insertPriorityHashTable(temp50);
	printTable();
	printf("\n");
	priorityNodeQ_t* test;
	// deques [0]
	test = dequeueFromPriorityHashTable(0);
	if(test){
		printf("%d\n",test->value);
	}else{
		printf("%d\n",test);
	}
	printTable();
	printf("\n");
	
	// deques [0]
	test = dequeueFromPriorityHashTable(0);
	if(test){
		printf("%d\n",test->value);
	}else{
		printf("%d\n",test);
	}
	printTable();
	printf("\n");
	// deques [0]
	test = dequeueFromPriorityHashTable(0);
	if(test){
		printf("%d\n",test->value);
	}else{
		printf("%d\n",test);
	}
	printTable();
	printf("\n");
	
	// deques [0]
	test = dequeueFromPriorityHashTable(0);
	if(test){
		printf("%d\n",test->value);
	}else{
		printf("%d\n",test);
	}
	printTable();
	printf("\n");
	
	// deques [0]
	test = dequeueFromPriorityHashTable(0);
	if(test){
		printf("%d\n",test->value);
	}else{
		printf("%d\n",test);
	}
	printTable();
	printf("\n");
	
	// deques [0]
	test = dequeueFromPriorityHashTable(0);
	if(test){
		printf("%d\n",test->value);
	}else{
		printf("%d\n",test);
	}
	printTable();
	printf("\n");
	// deques [1]
	test = dequeueFromPriorityHashTable(1);
	if(test){
		printf("%d\n",test->value);
	}else{
		printf("%d\n",test);
	}
	printTable();
	printf("\n");	
	
	// deques [3]
	test = dequeueFromPriorityHashTable(3);
	if(test){
		printf("%d\n",test->value);
	}else{
		printf("%d\n",test);
	}
	printTable();
	printf("\n");
	
	// deques [1]
	test = dequeueFromPriorityHashTable(1);
	if(test){
		printf("%d\n",test->value);
	}else{
		printf("%d\n",test);
	}
	printTable();
	printf("\n");
}
Comments
Post a Comment