数据结构——多重链表的实现

//多重列表的实现
#include<stdio.h>
#include<stdlib.h>
struct lnode
{
	int row,col,value;
};
//没有用到down指针
//没有用到tag和next指针 
typedef struct node
{
    int tag;//区分头结点(0)和非零元素结点(1)
	struct node* right;
	struct node* down;
	//共用体与结构体的区别在于:修改一个成员会影响其他所有成员(同一时刻只能保存一个成员的值) 
	union
	{
		struct node *next;//头结点 
		struct lnode k;//非零元素结点 
	}con;
}node;
typedef node* dlist;
typedef struct dlist2
{
	dlist z[105];
}dlist2;
//用llist指针找到多个空的头节点 
typedef dlist2* llist;
int js1=0,js[105];//找到链表中每个头节点链接的第一个节点 
llist empty()
{
	int a,b,c;
	printf("请输入矩阵行数:");
	scanf("%d",&a);
	printf("请输入矩阵列数:");
	scanf("%d",&b);
	printf("请输入总元素:");
	scanf("%d",&c);
	llist headnode;
	dlist p_now[105],p_next[105];
	int i,j;int x;
	//分配内存! 
    headnode=(llist)malloc(sizeof(dlist2));
    for(i=1;i<=100;i++) headnode->z[i]=(dlist)malloc(sizeof(node));
	for(i=1;i<=a;i++)
	{
		js1=0;
		for(j=1;j<=b;j++)
		{
			scanf("%d",&x);
			if(x!=0)
			{
				js1++;js[j]++;
				//储存输入的结点 
				p_next[i]=(dlist)malloc(sizeof(node));
				p_next[i]->con.k.row=i;
				p_next[i]->con.k.col=j;
				p_next[i]->con.k.value=x;
				p_next[i]->right=NULL;
				
				p_next[j]=(dlist)malloc(sizeof(node));
				p_next[j]->con.k.row=i;
				p_next[j]->con.k.col=j;
				p_next[j]->con.k.value=x;
				p_next[j]->down=NULL;
				//接入链表(记得特殊处理直接链接头节点的点) 
	            if(js[j]==1) 
	            {
				    headnode->z[j]->down=p_next[j];
				    p_now[j]=headnode->z[j];
			    }
			    else p_now[j]->down=p_next[j];//第j列向下链接
			    if(js1==1)
			    {
			   	    headnode->z[i]->right=p_next[i];
			   	    p_now[i]=headnode->z[i];
			    }
			    else p_now[i]->right=p_next[i];//第i行向右链接 
			    //预备处理后续结点 
				p_now[i]=p_next[i];
				p_now[j]=p_next[j];
			} 
		}
	}
	headnode->z[a+1]=NULL;//为"按行输出"做准备 
	return headnode;
}
void print(llist headnode)
{
	int i;dlist head;
	for(i=1;headnode->z[i]!=NULL;i++)
	{
		//找到一行的头节点 
		head=headnode->z[i];
		head=head->right;
		//输出一行的全部元素 
		while(head!=NULL)
		{
			printf("(%d,%d,%d) ",head->con.k.col,head->con.k.row,head->con.k.value);
			head=head->right;
		}
		printf("\n");
	}
} 
int main()
{
	llist na;
	na=empty();
	printf("输出矩阵:\n");
	print(na); 
	return 0; 
} 
相关推荐
Monodye2 分钟前
【Java】网络编程:TCP_IP协议详解(IP协议数据报文及如何解决IPv4不够的状况)
java·网络·数据结构·算法·系统架构
pzx_0017 分钟前
【内积】内积计算公式及物理意义
数据结构·python·opencv·算法·线性回归
学习使我变快乐3 小时前
C++:用类实现链表,队列,栈
开发语言·c++·链表
重生之我要进大厂4 小时前
LeetCode 876
java·开发语言·数据结构·算法·leetcode
Happy鱿鱼5 小时前
C语言-数据结构 有向图拓扑排序TopologicalSort(邻接表存储)
c语言·开发语言·数据结构
KBDYD10105 小时前
C语言--结构体变量和数组的定义、初始化、赋值
c语言·开发语言·数据结构·算法
Crossoads5 小时前
【数据结构】排序算法---桶排序
c语言·开发语言·数据结构·算法·排序算法
QXH2000005 小时前
数据结构—单链表
c语言·开发语言·数据结构
imaima6665 小时前
数据结构----栈和队列
开发语言·数据结构
David猪大卫6 小时前
数据结构修炼——顺序表和链表的区别与联系
c语言·数据结构·学习·算法·leetcode·链表·蓝桥杯