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. linux基础(10)-导航菜单

    导航菜单实战 例:编写一个shell脚本,包含多个菜单,其中需要一个退出选项:可单选也可多选:根据序号选择后,显示所选菜单名称. #!/bin/bash ####################### ...

  2. mysql安装失败后重装的方法

  3. 解决可以Ping通ip地址,但Ping不通域名的思路

    在正常的网络故障处理中,ping命令是大家经常用到的,出现ping通ip地址,但ping域名是出现超时情况,一般是由于TCP/IP协议中的“DNS设置”不正确,请检查其中的配置,或者更换其他可用的DN ...

  4. Qt 安装事件过滤器installEventFilter

    Qt 安装事件过滤器installEventFilter (2013-01-28 14:29:18) 转载▼   分类: 工作笔记 Qt的事件模型一个强大的功能是一个QObject对象能够监视发送其他 ...

  5. mapreduce job提交流程源码级分析(二)(原创)

    上一小节(http://www.cnblogs.com/lxf20061900/p/3643581.html)讲到Job. submit()方法中的: info = jobClient.submitJ ...

  6. linux下如何查看某个软件 是否安装??? 安装路径在哪???

    <1>.在linux下如何判断是否已经安装某个软件? 我的系统是red hat 我用命令rpm查是否安装了某个软件(例如: matlab 与 fluent ),得到了如下的结果: 我用rp ...

  7. linux---mysql忘记密码

    二.忘记原来的myql的root的密码: 首先,你必须要有操作系统的root权限了.要是连系统的root权限都没有的话,先考虑root系统再走下面的步骤.类似于安全模式登录系统,有人建议说是pkill ...

  8. python编程实例-使用正则收集IP信息

    #!/usr/bin/env python from subprocess import PIPE,Popen import re def getIfconfig(): p = Popen(['ifc ...

  9. codeforces D. Area of Two Circles' Intersection 计算几何

    D. Area of Two Circles' Intersection time limit per test 2 seconds memory limit per test 256 megabyt ...

  10. UVA - 10570 Meeting with Aliens (置换的循环节)

    给出一个长度不超过500的环状排列,每次操作可以交换任意两个数,求把这个排列变成有序的环状排列所需的最小操作次数. 首先把环状排列的起点固定使其成为链状排列a,枚举排好序时的状态b(一种有2n种可能) ...