C语言数据结构-数组广义表-十字链表-实现十字链表的初始化操作-实现十字链表的删除操作
十字链表
十字链表相关定义如下:
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语言数据结构-数组广义表-十字链表-实现十字链表的初始化操作-实现十字链表的删除操作相关推荐
- C语言——数据结构之广义表(概念及其存储结构)
前言 本节我们来说说C语言中的广义表.主要介绍广义表的概念定义,并说明其存储结构,算法中将使用到递归思想. 广义表是线性表的一种推广,在数据结构中有广泛应用. 一.广义表的概念 1.广义表的概念 (1 ...
- 对广义表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.() 本题考查广义表的概念和特征. 广义 ...
- 【数据结构】广义表的存储结构及基本运算(C语言)
目录 1. 广义表基本概念 2. 广义表的存储结构 2.1 头尾链表存储结构 2.2 同层结点链存储结构 3. 广义表的基本运算 3.1 求表头.表尾 3.2 求长度.深度 3.3 统计原子数目 3. ...
- 数据结构之广义表(C语言)
文章目录 1.广义表的定义 2.广义表的存储结构 3.代码结构描述 5.广义表的各类操作 6.代码测试 7.完整代码 作者建议:为了方便读者能够更加理解代码实现,建议各位读者在看代码的时候可以参考广义 ...
- (C语言!)广义表(头尾链表)的建立和输出
s 零零散散花了近半天的时间,查看各种资料,总算是完成了头尾链表存储结构的广义表的建立以及一种输出. 第一次写一篇文章记录一下此时的思路,唉,免不了过两天就忘了! 一 ,首先,结构体的定义很常规. t ...
- 数据结构之广义表的相关知识点
一,广义表的基本概念: 广义表(Lists,又称列表)是一种非线性的数据结构,是线性表的一种推广.即广义表中放松对表元素的原子限制,容许它们具有其自身结构(即可以有子表).它被广泛的应用于人工智能等领 ...
- 【数据结构】广义表的介绍
参考资料:<数据结构(C语言版)严蔚敏著> 版权说明:未经作者允许,禁止转载.如引用本文内容,需标明作者及出处.如本文侵犯了您的权益,请联系我删除并致歉. 文章说明:如文章中出现错误,请联 ...
- c++数据结构之广义表
最近学习了广义表,我们知道广义表也是一种线性表,而顾名思义广义表就是不止一个表,下面来举个栗子: A=( ) B=(1 , 2,3) C=(1 ,2 ,3, ( a , b ,c) ) D=(1, 2 ...
- 用标准C语言初始化线性表,C语言数据结构-顺序线性表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作...
1.数据结构-顺序线性表的实现-C语言 #define MAXSIZE 100 //结构体定义 typedef struct { int *elem; //基地址 int length; //结构体当 ...
最新文章
- 马上 2018 年了,该不该下定决心转型AI呢?
- IPv6 — IPv4v6 综合组网技术
- python十大高级特性_python--高级特性
- oracle 5种索引方式,MySQL使用索引的几种方式
- 手写自己的MyBatis框架-操作流程
- 前端学习(3278):循环 遍历
- 第六十二期:看完这篇还不了解Nginx,那我就哭了!
- C语言注释与C++注释的相互转换
- 常用插件的封装(轮播图、选项卡、楼梯导航及、拖拽)
- win7睡眠,休眠的区别
- ubuntu18.04环境系安装指定版本gitlab-ce
- 搭载Apple芯片的Mac如何使用macOS恢复?
- JAVA设计模式之3-抽象工厂模式
- 通达信资金净流入公式_通达信指标公式:资金净流入,监控资金流入流出,分享...
- 【自学Flutter】20.3 ListView.separated 的使用
- RBM算法模型应用在推荐系统 Python代码实现
- 【Java】月份枚举
- 学习笔记三:衍生兄弟——过冲和振铃
- 基于Mathcad的LLC公式推导与化简(一)
- 1080p显示器与2k的差别究竟有多大?该如何选择
热门文章
- SSM毕设项目Java外包项目管理系统mt1a1(java+VUE+Mybatis+Maven+Mysql)
- xshell详细jdk环境配置教程
- Android之仿IOS悬浮窗
- 【PC工具】免费软件变收费软件?更新关闭win10更新工具及使用方法
- 编写一个程序,接受一个整数输入,然后显示所有小于或等于该数的素数。
- Mac npm 设置淘宝镜像
- c语言中定义结构体指针的作用,C语言结构体定义,使用及指针(1)
- 海康大华监控摄像机接入SkeyeVSS视频融合平台配置详细步骤
- Azure SignaIR 将数据从服务器实时推送到Web 和移动浏览器、桌面应用、移动应用等客户端
- Linux Ubuntu多版本python pip共存