十字链表

十字链表相关定义如下:

typedef int ElemType;// 非零元素结点结构
typedef struct OLNode
{int row,col;ElemType value;struct OLNode *right,*down;
}OLNode,*OLink;// 十字链表结构
typedef struct
{OLink *rowhead,*colhead;int rows,cols,nums;
}CrossList, *PCrossList;

1)实现十字链表的初始化操作:

 int init_cross_list(PCrossList L, const ElemType *A, int m, int n);

其中 L 指向 CrossList 结构,且各成员已被初始化为0;
A 为 ElemType 类型数组中第一个元素的地址,元素的个数为 m×n 个,按行优先存储(即A[0] 为十字链表第1行第1列的元素;
A[1] 为第1行第2列的元素,A[n] 为第2行第1列的元素,A[n+1] 为第2行第2个元素);
m 表示十字链表的行数,n 表示十字链表的列数。
init_cross_list 函数将 ElemType 数组中非0元素保存到十字链表中,函数返回非 0 元素的个数。

2)实现十字链表的删除操作:

 int del_cross_list(PCrossList L, ElemType k);

其中 L 指向 要处理的 CrossList 结构,k 为要删除的元素;
del_cross_list 函数删除十字链表中所有值为 k 的结点,并返回删除结点的个数。

提供代码

#include <stdio.h>
#include <stdlib.h>
#include "crosslist.h"int init_cross_list(PCrossList L, const ElemType *A, int m,int n){}int del_cross_list(PCrossList L, ElemType k){}

参考代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//#include "crosslist.h"typedef int ElemType;// 非零元素结点结构
typedef struct OLNode
{int row, col;ElemType value;struct OLNode* right, * down;
}OLNode, * OLink;// 十字链表结构
typedef struct
{OLink* rowhead, * colhead;int rows, cols, nums;
}CrossList, * PCrossList;int init_cross_list(PCrossList L, const ElemType* A, int m, int n)
{int i, j, sum = 0;OLNode* p, * q;L->rows = m;L->cols = n;if (!(L->rowhead = (OLink*)malloc((m + 1) * (sizeof(OLink)))))return 0;if (!(L->colhead = (OLink*)malloc((n + 1) * (sizeof(OLink)))))return 0;for (i = 0; i < m; i++) {L->rowhead[i] = NULL;}for (i = 0; i < n; i++) {L->colhead[i] = NULL;}for (i = 0; i < m; i++) {for (j = 0; j < n; j++) {if (A[i * n + j] != 0) {sum++;if (!(p = (OLNode*)malloc(sizeof(OLNode))))return 0;p->row = i;p->col = j;p->value = A[i * n + j];if (L->rowhead[i] == NULL || L->rowhead[i]->col > j) {p->right = L->rowhead[i];L->rowhead[i] = p;}else {for (q = L->rowhead[i]; (q->right) && (q->right->col < j); q = q->right);p->right = q->right;q->right = p;}if (L->colhead[j] == NULL || L->colhead[j]->row > i) {p->down = L->colhead[j];L->colhead[j] = p;}else {for (q = L->colhead[j]; (q->down) && (q->down->row < i); q = q->down);p->down = q->down;q->down = p;}}}}L->nums = sum;return sum;
}
void delete_crossList(PCrossList clist, int row, int col, int k)
{OLNode* tmp = NULL;OLNode* tmp1 = NULL;OLNode* tmp2 = NULL;OLNode* t = NULL;OLNode* t1 = NULL;OLNode* t2 = NULL;//删除一个结点需要修改行结点指针和列结点指针tmp = clist->rowhead[row];t = clist->colhead[col];if (tmp->value == k) {clist->rowhead[row] = tmp->right;}if (t->value == k) {clist->colhead[col] = t->down;}if (t->value == k) {free(t);return;}//行遍历元素while (tmp) {tmp1 = tmp;tmp = tmp->right;if (tmp && tmp->row == row && tmp->col == col) {tmp2 = tmp;tmp1->right = tmp2->right;break;}}//列遍历元素while (t) {t1 = t;t = t->down;if (t && t->row == row && t->col == col) {t2 = t;t1->down = t2->down;break;}}free(t);clist->nums--;
}
int del_cross_list(PCrossList L, ElemType k)
{OLink pt;int i, j;int sum = 0;for (i = 0; i < L->rows; i++) {pt = L->rowhead[i];for (j = 0; j < L->cols; j++) {if (pt && pt->col == j) {if (pt->value == k) {delete_crossList(L, i, j, k);sum++;}pt = pt->right;}}printf("\n");}return sum;
}void test01()
{CrossList L;int m = 3, n = 4;int A[21] = { 0, 0, 0, 8, 0, 0, 73, 0, 0, 0, 0, 67 };init_cross_list(&L, A, m, n);del_cross_list(&L, 8);
}void main()
{test01();return 0;
}

十字链表实例

十字链表相关知识

https://blog.csdn.net/aiqq136/article/details/115303041

手写过程

C语言数据结构-数组广义表-十字链表-实现十字链表的初始化操作-实现十字链表的删除操作相关推荐

  1. C语言——数据结构之广义表(概念及其存储结构)

    前言 本节我们来说说C语言中的广义表.主要介绍广义表的概念定义,并说明其存储结构,算法中将使用到递归思想. 广义表是线性表的一种推广,在数据结构中有广泛应用. 一.广义表的概念 1.广义表的概念 (1 ...

  2. 对广义表L=((a,b),(c,d),(e,f))执行操作tail(tail(L))的结果是 ()

    对广义表L=((a,b),(c,d),(e,f))执行操作tail(tail(L))的结果是 (  ) . A.(e,f) B.((e,f)) C.(f) D.() 本题考查广义表的概念和特征. 广义 ...

  3. 【数据结构】广义表的存储结构及基本运算(C语言)

    目录 1. 广义表基本概念 2. 广义表的存储结构 2.1 头尾链表存储结构 2.2 同层结点链存储结构 3. 广义表的基本运算 3.1 求表头.表尾 3.2 求长度.深度 3.3 统计原子数目 3. ...

  4. 数据结构之广义表(C语言)

    文章目录 1.广义表的定义 2.广义表的存储结构 3.代码结构描述 5.广义表的各类操作 6.代码测试 7.完整代码 作者建议:为了方便读者能够更加理解代码实现,建议各位读者在看代码的时候可以参考广义 ...

  5. (C语言!)广义表(头尾链表)的建立和输出

    s 零零散散花了近半天的时间,查看各种资料,总算是完成了头尾链表存储结构的广义表的建立以及一种输出. 第一次写一篇文章记录一下此时的思路,唉,免不了过两天就忘了! 一 ,首先,结构体的定义很常规. t ...

  6. 数据结构之广义表的相关知识点

    一,广义表的基本概念: 广义表(Lists,又称列表)是一种非线性的数据结构,是线性表的一种推广.即广义表中放松对表元素的原子限制,容许它们具有其自身结构(即可以有子表).它被广泛的应用于人工智能等领 ...

  7. 【数据结构】广义表的介绍

    参考资料:<数据结构(C语言版)严蔚敏著> 版权说明:未经作者允许,禁止转载.如引用本文内容,需标明作者及出处.如本文侵犯了您的权益,请联系我删除并致歉. 文章说明:如文章中出现错误,请联 ...

  8. c++数据结构之广义表

    最近学习了广义表,我们知道广义表也是一种线性表,而顾名思义广义表就是不止一个表,下面来举个栗子: A=( ) B=(1 , 2,3) C=(1 ,2 ,3, ( a , b ,c) ) D=(1, 2 ...

  9. 用标准C语言初始化线性表,C语言数据结构-顺序线性表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作...

    1.数据结构-顺序线性表的实现-C语言 #define MAXSIZE 100 //结构体定义 typedef struct { int *elem; //基地址 int length; //结构体当 ...

最新文章

  1. 马上 2018 年了,该不该下定决心转型AI呢?
  2. IPv6 — IPv4v6 综合组网技术
  3. python十大高级特性_python--高级特性
  4. oracle 5种索引方式,MySQL使用索引的几种方式
  5. 手写自己的MyBatis框架-操作流程
  6. 前端学习(3278):循环 遍历
  7. 第六十二期:看完这篇还不了解Nginx,那我就哭了!
  8. C语言注释与C++注释的相互转换
  9. 常用插件的封装(轮播图、选项卡、楼梯导航及、拖拽)
  10. win7睡眠,休眠的区别
  11. ubuntu18.04环境系安装指定版本gitlab-ce
  12. 搭载Apple芯片的Mac如何使用macOS恢复?
  13. JAVA设计模式之3-抽象工厂模式
  14. 通达信资金净流入公式_通达信指标公式:资金净流入,监控资金流入流出,分享...
  15. 【自学Flutter】20.3 ListView.separated 的使用
  16. RBM算法模型应用在推荐系统 Python代码实现
  17. 【Java】月份枚举
  18. 学习笔记三:衍生兄弟——过冲和振铃
  19. 基于Mathcad的LLC公式推导与化简(一)
  20. 1080p显示器与2k的差别究竟有多大?该如何选择

热门文章

  1. SSM毕设项目Java外包项目管理系统mt1a1(java+VUE+Mybatis+Maven+Mysql)
  2. xshell详细jdk环境配置教程
  3. Android之仿IOS悬浮窗
  4. 【PC工具】免费软件变收费软件?更新关闭win10更新工具及使用方法
  5. 编写一个程序,接受一个整数输入,然后显示所有小于或等于该数的素数。
  6. Mac npm 设置淘宝镜像
  7. c语言中定义结构体指针的作用,C语言结构体定义,使用及指针(1)
  8. 海康大华监控摄像机接入SkeyeVSS视频融合平台配置详细步骤
  9. Azure SignaIR 将数据从服务器实时推送到Web 和移动浏览器、桌面应用、移动应用等客户端
  10. Linux Ubuntu多版本python pip共存