线性表的链式存储——C语言实现
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语言实现的更多相关文章
- 线性表的链式存储C语言版
#include <stdio.h> #include <malloc.h> #define N 10 typedef struct Node { int data; stru ...
- C++线性表的链式存储结构
C++实现线性表的链式存储结构: 为了解决顺序存储不足:用线性表另外一种结构-链式存储.在顺序存储结构(数组描述)中,元素的地址是由数学公式决定的,而在链式储存结构中,元素的地址是随机分布的,每个元素 ...
- C++编程练习(2)----“实现简单的线性表的链式存储结构“
单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 对于查找操作,单链表的时间复杂度为O(n). 对于插入和删除操作,单链表在确定位置后,插入和删除时间仅为O(1). 单链表不需要分配存储 ...
- C 线性表的链式存储实现及插入、删除等操作示例
一.链式存储的优势 线性表的存储可以通过顺序存储或链式存储实现,其中顺序存储基于数组实现(见本人上一篇博客),在进行插入删除等操作时,需对表内某一部分元素逐个移动,效率较低.而链式结构不依赖于地址连续 ...
- 数据结构-线性表的链式存储相关算法(C语言实现)
链表的简单介绍 为什么需要线性链表 当然是为了克服顺序表的缺点,在顺序表中,做插入和删除操作时,需要大量的移动元素,导致效率下降. 线性链表的分类 按照链接方式: 按照实现角度: 线性链表的创建和简单 ...
- 线性表 顺序存储 链式存储 ---java实现
首先抽象出一个线性表抽象类(包括主要的增删操作) public abstract class MyAbstractList<E> { public abstract void add(E ...
- typedef struct LNode命名结构指针(线性表的链式存储)
一.typedef 关键字 1. 简介: typedef工具是一个高级数据特性,利用typedef可以为某一些类型自定义名称. 2. 工作原理: 例如我们定义链表的存储结构时,需要定义结点的存储数据元 ...
- 线性表的链式存储结构的实现及其应用(C/C++实现)
存档----------- #include <iostream.h> typedef char ElemType; #include "LinkList.h" voi ...
- 线性表的顺序存储和链式存储c语言实现
一.线性表的顺序存储 typedef int ElemType;typedef struct List { ElemType *data;//动态分配 ,需要申请空间 int length; }Lis ...
随机推荐
- DS 和【ADDRESS】学习记录
CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址. 内存单元由2部分组成. 8086CPU中,内存地址由以下组成. 1:段地址 2:偏移地址 8086CPU中,有一个DS寄存器地址,通常用 ...
- NovaException: Unexpected vif_type=binding_failed
nova/virt/libvirt/vif.py: _("Unexpected vif_type=%s") % vif_type) NovaException: Unexpecte ...
- c++ STL库deque和vector的例子
头文件wuyong.h: #pragma once #include<iostream> #include<vector> #include<deque> #inc ...
- java文件读写常用方法
// TODO Auto-generated method stub //File file = new File("D:\\Android\\workspace\\Practice1\\s ...
- linux(ubuntu16.04)下安装和破解pycharm专业版
我用的linux 版本是ubuntu,查看版本命令是: lsb_release -a 因为学习Python爬虫,pycharm是Python很好用的IDE,但是专业版需要付费,所以开始安装: 首先在官 ...
- 11-THREE.JS 相机始终朝向某个物体
<!DOCTYPE html> <html> <head> <title></title> <script src="htt ...
- application.yml配置log日志
#日志文件的配置logging: pattern: console: "%d - %msg%n" file: /var/log/sell.log 注解@Slf4j
- LeetCode OJ:Largest Number(最大数字)
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...
- MAMP mac下启动Mysql
MAMP mac下启动Mysql /Applications/MAMP/Library/bin/mysql -u root -p 初始密码 root:
- 2018年 7月总结&8月计划
7月悄然而过... 英语: a打卡率:1号上课没有完成听力,7号上课没有完成阅读,21,22号考试 没有阅读 PS:学习效果测评 1)不要再阅读china English 2)单词要拼写 3)听力句子 ...