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. 【bzoj1040】骑士[ZJOI2008](树形dp)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1040 这道题,很明显根据仇恨关系构造出的图形是一堆环套树.如果是普通的树,就可以马上裸树 ...

  2. 增强织梦DedeCMS“更新系统缓存”清理沉余缓存的功能

    我们使用织梦DedeCMS系统有很长一段时间后,不间断的在后台更新系统缓存的时候,有些缓存文件夹及缓存文件没有被清理,导致日积月累的垃圾缓存文件越来越多,可以以百千万计算,现在增强更新系统缓存功能清理 ...

  3. 回溯法之k着色问题

    package main import ( "fmt" ) type Graphic struct { edges [][]int colors int color []int f ...

  4. Live disk migration with libvirt blockcopy

    nova采用 libvirt blockcopy(python  API virDomainBlockRebase)来做live snapshot. Create the base image: $ ...

  5. linux防火墙开关

    对于普通Linux机器开关防火墙命令: 1重启后生效 chkconfig iptables off chkconfig iptables on 2即时生效 serivce iptables statu ...

  6. ios 获取导航栏和状态栏高度,针对iPhoneX

    因为iPhoneX的产生,原本的导航栏再也不是44了,那么会出现什么问题呢?在隐藏导航栏的页面,原本的高度要向上调整一个导航栏+状态栏的高度.那么iPhoneX的导航栏高度不是44了,我们需要手动获取 ...

  7. 防止xss,sql攻击函数

    <?php //php防注入和XSS攻击通用过滤. //by qq:831937 $_GET && SafeFilter($_GET); $_POST && Sa ...

  8. 算法练习4---冒泡排序java版

    冒泡排序的基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反 ...

  9. idea配置sliksvn解决无法配置1.8 format 问题

    1. 2. 3. 4. 5. 6. 啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦拉拉拉拉啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦 ...

  10. [项目部署] CentOs7 安装 MySQL/Tomcat/JDK 笔记

    0.安装 MySQL cd /usr/local/ # 新增yum源 rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-.no ...