线性表
  定义:线性表是具有相同特性的数据元素的一个有限序列
  类型:
    1:顺序存储结构
      定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构
      算法:

    #include <stdio.h>
#define LIST_INIT_SIZE 100
#define ERROR 0
#define OK 1 typedef struct{
// 线性表的顺序存储结构
int numbers[LIST_INIT_SIZE];
int length;
}Sqlist;
int ListInsert_Sq(Sqlist * sl,int i,int number);
int ListDelete_Sq(Sqlist * sl,int i);
int main(void){
Sqlist x;
x.numbers[] = ;
x.numbers[] = ;
x.numbers[] = ;
x.length = ; printf("数组长度:%d\n",x.length);
// 插入线性表 在1的位置插入值5
ListInsert_Sq(&x,,);
printf("数组长度:%d\n",x.length);
ListDelete_Sq(&x,);
printf("数组长度:%d\n",x.length);
} // 插入算法
int ListInsert_Sq(Sqlist * sl,int i,int number){
if(i < || i >= sl->length){
return ERROR;
}
int y;
for(y = sl->length;y < i; y--){
sl->numbers[y] = sl->numbers[y-];
}
sl->numbers[i] = number;
++sl->length;
return OK;
}
// 删除算法
int ListDelete_Sq(Sqlist * sl,int i){
if(i < || i >= sl->length){
return ERROR;
}
int y;
for(y = i;y < sl->length; y++){
sl->numbers[y] = sl->numbers[y+];
}
--sl->length;
return OK;
}

2:链式存储结构
  定义:节点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻
  类型:
    单链表:节点只有一个指针域的链表,称为单链表。
    单链表是由头指针唯一确定,因此单链表可以用头指针的名字来命名
    双链表:节点有两个指针域的链表
    循环链表:首尾相接的链表

  单链表算法:

  

#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1 typedef struct Londe{ // 声明节点的类型和指向节点的指针类型
int number; // 节点的数据与
struct Londe *next; // 节点的指针域
}Londe;
typedef Londe *LinkList; // LinkList为指向结构体 Londe 的指针类型
// 初始化单链表
int initList_L(LinkList *L);
// 清除单链表
int ClearList_L(LinkList L);
// 销毁链表
int DestoryList_L(LinkList *L);
// 获取链表长度
int GetLength_L(LinkList L);
// 通过数据域获取链表索引
int GetDataByI_L(LinkList L,int i);
// 删除指定索引
int DeleteIList_L(LinkList *L,int i);
// 在指定索引上插入数据
int InsertList_L(LinkList *L,int i,int number);
// 遍历链表
int ShowKist_L(LinkList L);
int main(void){
// 头指针
LinkList list = NULL;
initList_L(&list); //ClearList_L(list);
//printf("%p",list);
//DestoryList_L(&list);
//printf("%p",list);
//printf("表长:%d",GetLength_L(list));
//printf("第0个的值%d",GetDataByI_L(list,0));
//ShowKist_L(list); InsertList_L(&list,,);
InsertList_L(&list,,);
InsertList_L(&list,,);
DeleteIList_L(&list,);
ShowKist_L(list); }
// 初始化单链表
int initList_L(LinkList *link){
LinkList node = (LinkList)malloc(sizeof(Londe));
if(!node){
return ERROR;
}
node->number = ;
node->next = NULL;
*link = node;
return OK;
}
// 清除单链表
int ClearList_L(LinkList L){
if(!L) {
return ERROR;
}
LinkList per,next;
per = L->next;
while(per){
next = per->next;
free(per);
per = next;
}
L->next = NULL;
return OK;
}
// 销毁单链表
int DestoryList_L(LinkList *L){
LinkList p;
while(*L){
p = *L;
*L = (*L)->next;
free(p);
}
return OK;
}
// 求单链表的表长
int GetLength_L(LinkList L){
int length = ;
while(L){
length++;
L = L->next;
}
return length;
}
// 取第i个元素的值
int GetDataByI_L(LinkList L,int i){
// 判断大小
if(i < || GetLength_L(L) <= i){
return ERROR;
}
int index = ;
while(L){
if(index == i){
return L->number;
}
index++;
L = L->next;
}
return ERROR;
}
// 遍历
int ShowKist_L(LinkList L){
int i = ;
while(L) {
printf("第%d个,值%d \n",i,L->number);
L = L->next;
i++;
}
return ;
}
// 在第i个节点插入新节点
// 如果i是0,则插在最后
// 如果i是 GetLength_L(L),则插在最后面
int InsertList_L(LinkList *L,int i,int number){
if(i < || i > GetLength_L(*L)){
printf("i:%d;length:%d",i,GetLength_L(L));
return ERROR;
}
int index = ;
LinkList prev = NULL;
LinkList next = NULL;
LinkList x = *L;
while(x){
if(index == i-){
prev = x;
}
if(index == i){
next = x;
}
x = x->next;
index++;
}
LinkList node = (LinkList)malloc(sizeof(Londe));
node->number = number;
node->next = NULL;
if(prev){
node->next = prev->next;
prev->next = node; }else{
*L = node;
} return OK;
}
// 删除第i个节点
int DeleteIList_L(LinkList *L,int i) {
if(i < || i > GetLength_L(L)){
return ERROR;
}
int index = ;
LinkList prev = NULL,now = NULL;
LinkList x = *L;
while(x){
// 前一个
if(index == i-){
prev = x;
}
// 当前个
if(index == i){
now = x;
}
index++;
x = x->next;
}
prev->next = now->next;
if(prev) {
prev->next = now->next;
}else{
*L = now->next;
}
free(now);
return OK; }

c数据结构 -- 线性表之 顺序存储结构 于 链式存储结构 (单链表)的更多相关文章

  1. java资料——顺序存储结构和链式存储结构(转)

    顺序存储结构 主要优点 节省存储空间,随机存取表中元素 缺    点 插入和删除操作需要移动元素 在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构. 顺序存储结 ...

  2. C语言实现链表(链式存储结构)

    链表(链式存储结构)及创建 链表,别名链式存储结构或单链表,用于存储逻辑关系为 "一对一" 的数据.与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其 ...

  3. javascript实现数据结构:线性表--线性链表(链式存储结构)

    上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...

  4. [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)

    优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...

  5. c数据结构 -- 线性表之 复杂的链式存储结构

    复杂的链式存储结构 循环链表 定义:是一种头尾相接的链表(即表中最后一个结点的指针域指向头结点,整个链表形成一个环) 优点:从表中任一节点出发均可找到表中其他结点 注意:涉及遍历操作时,终止条件是判断 ...

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

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

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

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

  8. 线性表的Java实现--链式存储(单向链表)

    单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素.由于不需要按顺序存储,链表在 ...

  9. C#数据结构-二叉树-链式存储结构

    对比上一篇文章"顺序存储二叉树",链式存储二叉树的优点是节省空间. 二叉树的性质: 1.在二叉树的第i层上至多有2i-1个节点(i>=1). 2.深度为k的二叉树至多有2k- ...

随机推荐

  1. JPA 常用注解

    @Entity(name=”EntityName”):必须,name为可选,对应数据库中一的个表 @Table(name=””,catalog=””,schema=””):可选 通常和@Entity配 ...

  2. sql 根据查询的记录生成序号的几种方式

    row_number()  order() 函数会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号. ra ...

  3. sql-labs 18-20(sqlmap注入)

    这三题主要是关于HTTP头部的注入 常见的HTTP注入点产生位置为 [Referer].[X-Forwarded-For].[Cookie].[X-Real-IP].[Accept-Language] ...

  4. Project Euler 133: Repunit nonfactors

    题意 英文 做法 结论1:\(R(a)|R(am)(a,m\ge 1)\) \[\frac{R(am)}{R(a)}=\frac{\frac{10^{am}-1}{9}}{R(a)}=\frac{\f ...

  5. 使用mysql8.+版本,使用mybatis的代码生成工具:mybatis-generator连接数据库时Unknown initial character set index '255' received from server. Initial client character set can be forced via the 'characterEncoding' property.

    Error connecting to database: (using class org.gjt.mm.mysql.Driver)Unknown initial character set ind ...

  6. APP和web设计区别

    1.web在给定了核心功能后,还可以往页面再添加小需求如banner.快捷工具条.分页等. APP界面设计时,则偏向精简,尽可能明显的展示核心功能. 2.APP中需要考虑ISO和Andriod两种交互 ...

  7. LaTeX技巧002:\section{}章节命令添加中文编译不了问题

    在宏包hyperref前面添加选项CJKbookmarks \usepackage[CJKbookmarks]{hyperref} 并且把这句话尽可能地加在导言区的最底部,即尽可能靠近 \begin{ ...

  8. vlan划分、本征vlan配置、中继

    命令部分: vlan划分(全局模式) vlan name v10 no shu no shu switchport access vlan vlan name v20 inter vlan no sh ...

  9. LED Keychain-Ideal For Mass Promotions

    Looking for something memorable to remind people of your business or nonprofit? Consider custom LED ...

  10. AtCoder Beginner Contest 154 题解

    人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...