#include <stdio.h>

#define false 0
#define true 1
#define MAXSIZE 20 typedef int bool;
typedef int ElementType; struct ListNode {
ElementType Data[MAXSIZE];
int length; // 线性表的长度
};
typedef struct ListNode List;
typedef struct ListNode *PtrToList; // 后续函数传参, 传的就是指针 PtrToList MakeEmpty (); // 创建空线性表
bool Insert (PtrToList L, ElementType X, int Pos); // 插入
void PrintNodes (PtrToList L); // 打印
int Find (PtrToList L, ElementType X); // 查找
bool Delete (PtrToList L, int Pos); // 删除 int main () {
PtrToList PtrDemo; // PtrDemo是指向结构体的指针变量 PtrDemo = MakeEmpty(); // 创建空表
/* 插入数据测试开始 */
Insert(PtrDemo, 100, 0);
Insert(PtrDemo, 10, 1);
Insert(PtrDemo, 1, 2);
Insert(PtrDemo, 21, 0);
PrintNodes(PtrDemo); // 21 100 10 1
/* 插入数据测试结束 */ /* 查找测试开始 */
int Pos; // 存放找到后元素的位置
int X = 1; // 要查找的元素
Pos = Find(PtrDemo, X);
printf("要查找的元素是: %d\n", X);
printf("位置信息是: %d\n", Pos); X = 200;
Pos = Find(PtrDemo, X);
printf("要查找的元素是: %d\n", X);
printf("位置信息是: %d\n", Pos);
/* 查找测试结束 */ /* 删除测试开始 */
printf("\n");
printf("当前线性表中的元素\n");
PrintNodes(PtrDemo);
Delete(PtrDemo, PtrDemo->length - 1); // 删除最后一个元素
printf("删除最后一个元素\n");
PrintNodes(PtrDemo);
/* 删除测试结束 */ return 0;
} // 1. 初始化
// 申请一个List需要的空间, 返回一个指向PtrToList的指针
PtrToList MakeEmpty () {
PtrToList L;
L = (PtrToList)malloc(sizeof(List));
L->length = 0;
return L;
} // 2. 插入
// Pos的合法位置是 0 ~ L->Length
// 例如 Pos=0, 则代表所有元素都向右移动一格, 把数组0下标空
// 出来, 执行, L->Data[0] = X;
// 成功返回true, 失败返回false
bool Insert (PtrToList L, ElementType X, int Pos) {
int i;
if (L->length == MAXSIZE) {
printf("表空间已满, 不能继续插入\n");
return false;
}
if (Pos < 0 || Pos > L->length) {
// i的合法取值是 1 ~ L->length - 1
printf("插入顺序不合法\n");
return false;
}
for (i=L->length; i>=Pos+1; i--) {
L->Data[i] = L->Data[i-1];
}
L->Data[Pos] = X;
L->length += 1;
return true;
} // 3. 打印输出
void PrintNodes (PtrToList L) {
int i;
printf("线性表长度: %d\n", L->length);
printf("线性表数据如下:\n");
for (i=0; i<L->length; i++) {
printf("%d\t", L->Data[i]);
}
printf("\n");
} // 4. 查找
// 给定元素值X, 查找其在线性表的位置
// 找到返回位置下标, 找不到返回 -1
int Find (PtrToList L, ElementType X) {
int i;
for (i=0; i<L->length; i++) {
if (L->Data[i] == X) {
return i;
}
}
return -1;
} // 5. 删除
// 删除指定位置Pos的元素
// Pos取值范围, [0, L->length-1]
bool Delete (PtrToList L, int Pos) {
int i;
if (Pos < 0 || Pos > L->length - 1) {
printf("删除位置错误\n");
return false;
}
for (i=Pos; i<=L->length; i++) {
L->Data[i] = L->Data[i + 1];
}
L->length--;
return true;
}

线性表 - C语言完整实现的更多相关文章

  1. 线性表之顺序存储结构(C语言动态数组实现)

    线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链 ...

  2. 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表

    一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...

  3. 数据结构算法C语言实现(一)---2.2线性表的顺序表示和实现

    注意: 虽然是用C语言实现,但是考虑到使用了一个C++的特性----引用以简化代码,所以所有的代码均以cpp作为后缀,用g++编译(以后不做说明). g++版本: 一.简述 本节主要讲述线性表的顺序实 ...

  4. 数据结构-线性表的链式存储相关算法(C语言实现)

    链表的简单介绍 为什么需要线性链表 当然是为了克服顺序表的缺点,在顺序表中,做插入和删除操作时,需要大量的移动元素,导致效率下降. 线性链表的分类 按照链接方式: 按照实现角度: 线性链表的创建和简单 ...

  5. 使用C语言实现线性表

    线性表是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列,序列中的每个数据元素,可以是一个数字,可以是一个字符,也可以是复杂的结构体或对象.例如:1,2,3,4,5是一个线性表,A,B ...

  6. <2014 05 16> 线性表、栈与队列——一个环形队列的C语言实现

    栈与队列都是具有特殊存取方式的线性表,栈属于先进后出(FILO),而队列则是先进先出(FIFO).栈能够将递归问题转化为非递归问题,这是它的一个重要特性.除了FILO.FIFO这样的最普遍存取方式外, ...

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

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

  8. 数据结构4:顺序表(线性表的顺序存储结构)及C语言实现

    逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为线性表的顺序存储结构. 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中,之间 ...

  9. 纯C语言实现线性表

    #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef int ElemType; typedef ...

随机推荐

  1. vi/vim 光标移动命令

    vi/vim 光标移动命令 移动光标上:k nk:向上移动n行 9999k或gg可以移到第一行 G移到最后一行下:j nj:向下移动n行左:h nh:向左移动n列右:l nl:向右移动n列 w:光标以 ...

  2. 手把手教你Chrome扩展开发:本地存储篇

    手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 HTML5 ...

  3. SpringMVC返回Json,自定义Json中Date类型格式

    http://www.cnblogs.com/jsczljh/p/3654636.html —————————————————————————————————————————————————————— ...

  4. EasyUI项目学习

    介绍easyui的使用,主要包括以下组件 布局面板 - layout 可伸缩面板 - accordion 选项卡 - tabs 控制面板 - panel 窗口 - window 对话框 - dialo ...

  5. J2EE是什么?

    解答:从整体上讲,J2EE是使用Java技术开发企业级应用的工业标准,它是Java技术不断适应和促进企业级应用过程中的产物.适用于企业级应用的J2EE,提供一个平台独立的.可移植的.多用户的.安全的和 ...

  6. android RadioGroup实现单选以及默认选中

    代码下载链接:http://download.csdn.net/detail/a123demi/7511835 本文将通过radiogroup和radiobutton实现组内信息的单选, 当中radi ...

  7. db2 设置表 not null

    db2将原表列notnull属性修改为null属性的方法   今天把自己遇到的一个小问题跟大家分享一下如何修改db2数据库表中列的属性--将列的非空属性改为允许空的属性,修改数据表的某一列属性其实很简 ...

  8. WPF数据验证(4)——响应与获取验证错误

    1780 前面的示例中,有关用户接受到错误的唯一指示是在违反规则的文本框周围的红色轮廓.为了提供更多信息,可以处理 Error 事件,但存储或清除错误时会引发该事件,但前提是必须确保已将 Bindin ...

  9. uva748 - Exponentiation 高精度小数的幂运算

    uva748 - Exponentiation   Exponentiation  Problems involving the computation of exact values of very ...

  10. (一)Spring容器相关操作

    一.spring事件 spring的事件有如下两个成员. 1.ApplicationEvent,容器事件,由容器发布 2.ApplicationListener 监听器,可以由容器中的任何监听器Bea ...