#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 typedef int ElemType; typedef struct{
ElemType data[MAXSIZE];
int length;
}SqList; SqList *InitList(SqList *L);//初始化
void DestroyList(SqList *L);//销毁
void ClearList(SqList *L);//清空列表
int ListEmpty(SqList *L);//判空
int ListLength(SqList *L);//返回线性表长度
int GetElem(SqList *L, int i, ElemType *e);//获取第i个元素
int LocateElem(SqList *L, ElemType e);//定位值为e的位置
ElemType PriorElem(SqList *L, ElemType cur_e);//查找前驱
ElemType NextElem(SqList *L, ElemType cur_e);//查找后继
int ListInsert(SqList *L, int i, ElemType e);//插入元素
int ListDelete(SqList *L, int i);//删除第i个元素
int TraverseList(SqList *L);//遍历线性表 //初始化线性表,返回头指针
SqList* InitList(SqList *L){
int x;
int index = ; L = (SqList *)malloc(sizeof(SqList));
if(L){
printf("输入到-1结束\n");
while(){
scanf("%d", &x);
if(x == -){
printf("初始化成功\n");
break;
};
L->data[index++] = x;
}
L->length = index;
}else{
printf("空间不足,初始化失败\n");
}
return L;
} //销毁线性表
void DestroyList(SqList *L){
free(L);
printf("销毁成功\n");
} //清空线性表
void ClearList(SqList *L){
int len = L->length;
int i;
for(i=; i<len; i++){
L->data[i] = ;
}
printf("清空成功\n");
} //判空,1为空,0不为空
int ListEmpty(SqList *L){
return (L->length == );
} //返回线性表长度
int ListLength(SqList *L){
return L->length;
} //获取第i个元素,返回是否获取的状态
int GetElem(SqList *L, int i, ElemType *e){
if(i< || i>L->length){
printf("查找下标%d越界\n",i);
return ;
}
*e = L->data[i-];
printf("第%d个元素是%d\n", i, *e);
return ;
} //返回第一个与e相同元素的位置,返回找寻到的下标
int LocateElem(SqList *L, ElemType e){
int i;
for(i=; i<L->length; i++){
if(L->data[i] == e){
printf("元素%d的位置是第%d个\n",e,i+);
return i+;
} }
printf("%d, 查无此元素的下标\n", e);
return ;
}
//返回元素为e的前驱元素
ElemType PriorElem(SqList *L, ElemType cur_e){
int idx = LocateElem(L, cur_e);
ElemType e;
if(!idx){
return ;
}
if(idx == ){
printf("第一个元素%d没有前驱\n", cur_e);
return ;
}
GetElem(L, idx-, &e);
printf("%d元素的前驱是%d\n",cur_e, e);
return e;
}
//返回元素e的后继元素
ElemType NextElem(SqList *L, ElemType cur_e){
int idx = LocateElem(L, cur_e);
ElemType e;
if(!idx){
return ;
}
if(idx == L->length){
printf("最后一个元素%d没有后继\n", cur_e);
return ;
}
GetElem(L, idx+, &e);
printf("%d元素的后继是%d\n",cur_e, e);
return e;
}
//插入,返回是否插入成功的状态
int ListInsert(SqList *L, int i, ElemType e){
if(i< || i>L->length+){
printf("插入位置有误\n");
return ;
}
if(L->length == MAXSIZE){
printf("线性表已满无法插入新元素\n");
return ;
}
int j;
for(j=L->length-; j>=i-; j--){
L->data[j+] = L->data[j];
}
L->data[i-] = e;
L->length++;
printf("插入成功\n");
return ;
}
//删除第i个元素,返回是否删除成功的状态
int ListDelete(SqList *L, int i){
if(i< || i>L->length){
printf("删除位置有误\n");
return ;
}
int j;
for(j=i; j<L->length; j++){
L->data[j-] = L->data[j];
}
L->length--;
printf("删除成功\n");
return ;
} //遍历线性表
int TraverseList(SqList *L){
if(L->length == ){
printf("空表\n");
return ;
}
if(L->length>MAXSIZE || L->length<-MAXSIZE){
printf("线性表已被摧毁或未初始化\n");
return ;
}
int j;
for(j=; j<L->length; j++){
printf("%d ", L->data[j]);
}
printf("\n");
} int main(void){
int idx;
int len;
ElemType e;
ElemType cur_e;
SqList *L = NULL; L = InitList(L); // printf("线性表长度为%d\n",ListLength(L)); // //判空测试
// if(ListEmpty(L))
// printf("线性表空\n");
// else
// printf("线性表不为空\n"); // //获取元素测试
// idx = 2;
// GetElem(L, idx, &e);
// GetElem(L, L->length+1, &e); // //获取位置测试
// LocateElem(L, 3); // //获取前驱测试
// cur_e = 4;
// PriorElem(L, cur_e);
// GetElem(L, 1, &cur_e);
// PriorElem(L, cur_e); // //插入测试
// ListInsert(L, 1, 999);
// TraverseList(L);
// ListInsert(L, L->length+1, 999);
// TraverseList(L); // //删除测试
// ListDelete(L, 1);
// TraverseList(L); // //清空测试
// ClearList(L);
// TraverseList(L); // //摧毁测试
// DestroyList(L);
// TraverseList(L);
return ;
}

书虽然说是C语言实现,但基本都是用C++的引用参数。

我就尝试把所有的用C语言实现,基本和书上的参数都是一一对应的,

把初始化的返回值改为了一个指针返回,就不用搞那种地址传递还是值传递的问题。

摧毁的功能还有点问题,debug正常,但是正常运行,表内的值还有保留的,百度下来

好像说free这个并不是真正意义上的都释放了。

如果有问题,请指出,我好进行改进。

纯C语言实现线性表的更多相关文章

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

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

  2. 浅谈c语言的线性表的基本操作———基于严蔚敏的数据结构(c语言版)

    主要讲的是线性表的创建,插入及删除: 0. 线性表的建立,对于这类操作主要是利用了结构体的性质,对于定义的线性表的特性主要有三点:首先 Typedef struct { ElemType   *ele ...

  3. 学习使用C语言实现线性表

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

  4. C语言实现线性表

    #include <stdio.h> #include <stdlib.h> //提供malloc()原型 /* 线性表需要的方法: 1. List MakeEmpty():初 ...

  5. 纯C语言实现线性链表

    #include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct LNode{ ElemT ...

  6. C语言实现线性表(链式存储方式)

    #include <stdio.h> #include <stdlib.h> //提供malloc()原型 typedef struct LNode *List; typede ...

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

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

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

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

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

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

随机推荐

  1. linux ptrace I【转】

    转自:https://www.cnblogs.com/mmmmar/p/6040325.html 这几天通过<游戏安全——手游安全技术入门这本书>了解到linux系统中ptrace()这个 ...

  2. 3-3 groupby操作

    Pandas章节应用的数据可以在以下链接下载:  https://files.cnblogs.com/files/AI-robort/Titanic_Data-master.zip .caret, . ...

  3. docker-nginx

    docker pull nginx docker run --name nginx -p 8080:80 -d nginx mkdir -p /data/nginx/www /data/nginx/l ...

  4. django之表设计、路由层等

    图书管理系统表的设计 from django.db import models # Create your models here. class Book(models.Model): title = ...

  5. zz开源 MNN:淘宝在移动 AI 上的实践

    开源 MNN:淘宝在移动 AI 上的实践   陈以鎏(离青) 阅读数:40612019 年 6 月 28 日   随着深度学习的快速发展和端侧设备算力的不断提升,原本在云端执行的推理预测工作正在部分迁 ...

  6. LeetCode 110. Balanced Binary Tree平衡二叉树 (C++)

    题目: Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced bin ...

  7. .Net反射-Type类型扩展

    /// <summary> /// Type 拓展 /// </summary> public static class TypeExtensions { /// <su ...

  8. web框架--tornado框架之模板引擎

    使用Tornado实现一个简陋的任务表功能demo来讲解tornado框架模板引擎 一.demo目录结构 二.具体文件内容 2.1.commons.css .body{ margin: 0; back ...

  9. 公共组件及脚手架webpack模板

    一.公共组件的创建和使用 前面已经学习vue组件时,了解了公共组件,但在脚手架项目中只使用过局部组件.这里是讲解全局组件如何在脚手架项目中去使用. 1.创建全局组件 在src/components/C ...

  10. 第30课 线程同步(std::condition_variable)

    一. 条件变量 (一)条件变量概述 多线程访问一个共享资源(或称临界区),不仅需要用互斥锁实现独享访问避免并发错误,在获得互斥锁进入临界区后,还需检查特定条件是否成立.当某个线程修改测试条件后,将通知 ...