SeqList.h

#ifndef _WBM_LIST_H_
#define _WBM_LIST_H_ typedef void List;
typedef void ListNode; //创建并且返回一个空的线性表
List* List_Create(); //销毁一个线性表list
void List_Destroy(List* list); //将一个线性表list中的所有元素清空, 线性表回到创建时的初始状态
void List_Clear(List* list); //返回一个线性表list中的所有元素个数
int List_Length(List* list); //向一个线性表list的pos位置处插入新元素node
int List_Insert(List* list, ListNode* node, int pos); //获取一个线性表list的pos位置处的元素
ListNode* List_Get(List* list, int pos); //删除一个线性表list的pos位置处的元素 返回值为被删除的元素,NULL表示删除失败
ListNode* List_Delete(List* list, int pos); #endif
SeqList.c

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "memwatch.h"
#include"SeqList.h" typedef struct _TSeqList
{
int capacity; //容量
int length; //长度
void **space; //指针空间
}TSeqList; List* List_Create(int max)
{
List* list = NULL;
TSeqList *t = (TSeqList *)malloc(sizeof(TSeqList)); if (t==NULL)
{
printf("初始化失败\n");
exit();
} t->capacity = max;
t->length = ;
t->space = (void **)malloc(sizeof(void *)*max); if (t->space==NULL)
{
printf("初始化失败\n");
exit();
}
list = (List *)t; return list;
} //销毁一个线性表list
void List_Destroy(List* list)
{
TSeqList* slist = (TSeqList*)list;
if (list == NULL)
{
return;
} if (slist->space != NULL)
{
free(slist->space);
} if (slist != NULL)
{
free(slist);
} return;
} //将一个线性表list中的所有元素清空, 线性表回到创建时的初始状态
void List_Clear(List* list)
{
TSeqList* slist = (TSeqList*)list;
if (list == NULL)
{
return;
} slist->length = ;
memset(slist->space, , sizeof(void *)*slist->capacity); return;
} //返回一个线性表list中的所有元素个数
int List_Length(List* list)
{
if (list == NULL)
{
printf("err");
return -;
} TSeqList* slist = (TSeqList*)list;
return slist->length;
return ;
} //向一个线性表list的pos位置处插入新元素node
int List_Insert(List* list, ListNode* node, int pos)
{
TSeqList* tlist = (TSeqList *)list;
int ret = ;
if (list == NULL || node == NULL)
{
ret = -; //输入参数有误
return ret;
}
if (tlist->capacity == tlist->length)
{
ret = -; //空间已满
return ret;
}
if (pos > tlist->length||pos<)
{
pos = tlist->length + ;
} //假设有7个元素,要插入第8个位置 ,就相当于插入list[7] 则 i=7;i>=7所以会移动一次。所以不应该等于
//假设有7个元素,要插入第6个位置 ,就相当于list[7]=list[6];list[6]=list[5]; 移动两次 i=7;i<6-1=5; i=7执行一次,i=6执行一次,i=5不会执行
for (int i = tlist->length; i > pos-; i--)
{
tlist->space[i] = tlist->space[i - ];
} tlist->space[pos - ] = node;
tlist->length++; return ret;
} //获取一个线性表list的pos位置处的元素
ListNode* List_Get(List* list, int pos)
{
TSeqList* tlist = (TSeqList *)list; if (list == NULL)
{
return NULL;
} if (pos< || pos>tlist->length)
{
return NULL;
} return tlist->space[pos - ];
} //删除一个线性表list的pos位置处的元素 返回值为被删除的元素,NULL表示删除失败
ListNode* List_Delete(List* list, int pos)
{
TSeqList* tlist =(TSeqList *)list; ListNode *p; if (list == NULL)
{
return NULL;
} if (pos< || pos>tlist->length)
{
return NULL;
}
//先取出元素,然后位移
p = tlist->space[pos - ];
for (int i = pos; i < tlist->length; i++)
{
tlist->space[i - ] = tlist->space[i];
} return p;
}
main.c

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "memwatch.h"
#include "SeqList.h" typedef struct _Teacher
{
int age;
char name[];
}Teacher; int main()
{
List *list = List_Create();
int ret = ;
int count = ;
Teacher t1,t2,t3;
t1.age = ;
strcpy(t1.name, "张三"); t2.age = ;
strcpy(t2.name, "李四"); t3.age = ;
strcpy(t3.name, "王五"); //向一个线性表list的pos位置处插入新元素node
ret = List_Insert(list, (void *)&t1, );
if (ret!=)
{
printf("err\n");
}
ret = List_Insert(list, (void *)&t2, );
if (ret != )
{
printf("err\n");
}
ret = List_Insert(list, (void *)&t3, );
if (ret != )
{
printf("err\n");
}
count = List_Length(list); printf("线性表目前长度为:%d\n",count); //获取一个线性表list的pos位置处的元素
ListNode* List_Get(List* list, int pos); printf("年龄\t姓名\n");
for (int i = ; i < ; i++)
{
ListNode *p = List_Get(list, i+);
printf("%d\t%s\n", ((Teacher *)(p))->age, ((Teacher *)(p))->name);
}
//删除一个线性表list的pos位置处的元素 返回值为被删除的元素,NULL表示删除失败 for (int i = ; i < ; i++)
{
ListNode *p = List_Delete(list,i+);
if (p != NULL)
{
printf("%d\t%s\n", ((Teacher *)(p))->age, ((Teacher *)(p))->name);
}
} List_Clear(list);
//销毁一个线性表list
List_Destroy(list); printf("hello\n");
//system("pause"); return ;
} int main02()
{
int *a = malloc(sizeof(int));
free(a);
printf("hello\n");
system("pause");
return ;
}

线性表的链式存储——C语言实现的更多相关文章

  1. 线性表的链式存储C语言版

    #include <stdio.h> #include <malloc.h> #define N 10 typedef struct Node { int data; stru ...

  2. C++线性表的链式存储结构

    C++实现线性表的链式存储结构: 为了解决顺序存储不足:用线性表另外一种结构-链式存储.在顺序存储结构(数组描述)中,元素的地址是由数学公式决定的,而在链式储存结构中,元素的地址是随机分布的,每个元素 ...

  3. C++编程练习(2)----“实现简单的线性表的链式存储结构“

    单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 对于查找操作,单链表的时间复杂度为O(n). 对于插入和删除操作,单链表在确定位置后,插入和删除时间仅为O(1). 单链表不需要分配存储 ...

  4. C 线性表的链式存储实现及插入、删除等操作示例

    一.链式存储的优势 线性表的存储可以通过顺序存储或链式存储实现,其中顺序存储基于数组实现(见本人上一篇博客),在进行插入删除等操作时,需对表内某一部分元素逐个移动,效率较低.而链式结构不依赖于地址连续 ...

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

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

  6. 线性表 顺序存储 链式存储 ---java实现

    首先抽象出一个线性表抽象类(包括主要的增删操作) public abstract class MyAbstractList<E> { public abstract void add(E ...

  7. typedef struct LNode命名结构指针(线性表的链式存储)

    一.typedef 关键字 1. 简介: typedef工具是一个高级数据特性,利用typedef可以为某一些类型自定义名称. 2. 工作原理: 例如我们定义链表的存储结构时,需要定义结点的存储数据元 ...

  8. 线性表的链式存储结构的实现及其应用(C/C++实现)

    存档----------- #include <iostream.h> typedef char ElemType; #include "LinkList.h" voi ...

  9. 线性表的顺序存储和链式存储c语言实现

    一.线性表的顺序存储 typedef int ElemType;typedef struct List { ElemType *data;//动态分配 ,需要申请空间 int length; }Lis ...

随机推荐

  1. JS,Jquery获取屏幕的宽度和高度

    Javascript: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.b ...

  2. Jquery取得iframe中元素的几种方法Javascript Jquery获取Iframe的元素、内容或者ID

    query取得iframe中元素的几种方法 在iframe子页面获取父页面元素代码如下: $('#objId', parent.document);// 搞定... 在父页面 获取iframe子页面的 ...

  3. Tensorflow中的transpose函数解析

    transpose函数作用是对矩阵进行转换操作 相信说完上面这一句,大家和我一样都是懵逼状态,完全不知道是怎么回事,那么接下来和我一起探讨吧 1.二维数组 x = [[1,3,5],  [2,4,6] ...

  4. 拷贝struts2项目时,运行后启动的是拷贝前的项目

    .解决方案: 然后

  5. review05

    子类与继承 所有类都是Object的子孙类. 子类继承了父类的成员变量和方法,就好像是在子类中直接定义了一样. 如果子类和父类在同一个包中,子类自然地继承了父类中不是private的成员变量和方法. ...

  6. 51nod 1215 单调栈/迭代

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1215 1215 数组的宽度 题目来源: Javaman 基准时间限制:1 ...

  7. 安装Nodejs、npm、Less(支持生成压缩后的css)

    安装Nodejs和npm 1.到https://nodejs.org/en/下载最新的版本,安装到d盘下,假设安装后的路径为D:\Program Files\nodejs, 笔者当前的版本v6.10. ...

  8. 常用T-CODE ,快捷键

    RSA1 --主界面. RSA8 --后台处理数据源和层次结构,很少使用 RSRT --QUERY 测试  .输入技术名称查询即可 RSRV--分析修复BW对象 RSMO --信息包监测. 检查处理链 ...

  9. 通过例子深入理解javascript中的new操作符

    1.首先看一道题目 function Cat(name,age){ this.name=name; this.age=age; } console.log(new Cat('miaomiao',18) ...

  10. LeetCode OJ:Contains DuplicateII(是否包含重复II)

    Given an array of integers and an integer k, find out whether there are two distinct indices i and j ...