线性表的顺序存储和链式存储c语言实现
一.线性表的顺序存储
- typedef int ElemType;
typedef struct List- {
- ElemType *data;//动态分配 ,需要申请空间
- int length;
- }List;
0.完整代码


- #include <stdio.h>
- #include <stdlib.h>
- #define MaxSize 50
- #define TRUE 1
- #define FALSE 0
- typedef int ElemType ;
- struct List
- {
- ElemType *data;//动态分配 ,需要申请空间
- int length;
- };
- void InitList(List *p);//初始化表
- int ListInsert(List *p,int i,ElemType e);//插入操作 (前插),在第i个位置插入数据e
- int ListDelete(List *p,int i);//删除操作,删除第i个位置数据
- int ListFindValue(List L,ElemType e);//按值查找元素e ,返回e在顺序表表的位置
- int ListFindLocate(List L,int i);//按位查找第i位的值
- int Empty(List L); //判空,如果表为空返回TRUE
- void PrintList(List L);//输出操作
- int main()
- {
- List L;
- InitList(&L);
- ListInsert(&L,,);
- ListInsert(&L,,);
- ListInsert(&L,,);
- ListInsert(&L,,);
- ListInsert(&L,,);
- PrintList(L);
- return ;
- }
- void InitList(List *p)
- {
- p->data=(ElemType*)malloc(sizeof(ElemType)*MaxSize);
- p->length=;
- }
- int ListInsert(List *p,int i,ElemType e)
- {
- if(i< || i>p->length+)
- {
- return FALSE;//插入位置不合法
- }
- if(p->length>=MaxSize)
- {
- return FALSE;//顺序表已满
- }
- for(int j=p->length;j>=i;j--)
- {
- p->data[j]=p->data[j-];
- }
- p->data[i-]=e;
- p->length++;
- return TRUE;
- }
- int ListDelete(List *p,int i)
- {
- if(i< || i>p->length)
- {
- return FALSE;
- }
- for(int j=i;j<p->length;j++)
- {
- p->data[j-]=p->data[j];
- }
- p->length--;
- return TRUE;
- }
- int ListFindValue(List L,ElemType e)
- {
- for(int i=;i<L.length;i++)
- {
- if(L.data[i]==e)
- {
- return i+;
- }
- }
- return FALSE;
- }
- int ListFindLocate(List L,int i)
- {
- return L.data[i-];
- }
- void PrintList(List L)
- {
- for(int i=;i<L.length;i++)
- {
- printf("%d ",L.data[i]);
- }
- printf("\n");
- }
- int Empty(List L)
- {
- if(L.length==)
- {
- return TRUE;
- }
- else
- {
- return FALSE;
- }
- }
1.初始化顺序表


- void InitList(List *p)
- {
- p->data=(ElemType*)malloc(sizeof(ElemType)*MaxSize);
- p->length=;
- }
2.插入操作 ,在第i个位置插入数据e


- int ListInsert(List *p,int i,ElemType e)
- {
- if(i< || i>p->length+)
- {
- return FALSE;//插入位置不合法
- }
- if(p->length>=MaxSize)
- {
- return FALSE;//顺序表已满
- }
- for(int j=p->length;j>=i;j--)
- {
- p->data[j]=p->data[j-];
- }
- p->data[i-]=e;
- p->length++;
- return TRUE;
- }
3.删除操作,删除第i个位置数据


- int ListDelete(List *p,int i)
- {
- if(i< || i>p->length)
- {
- return FALSE;
- }
- for(int j=i;j<p->length;j++)
- {
- p->data[j-]=p->data[j];
- }
- p->length--;
- return TRUE;
- }
4.按值查找元素 ,返回元素在顺序表的位置


- int ListFindValue(List L,ElemType e)
- {
- for(int i=;i<L.length;i++)
- {
- if(L.data[i]==e)
- {
- return i+;
- }
- }
- return FALSE;
- }
5.按位置查找元素


- int ListFindLocate(List L,int i)
- {
- return L.data[i-];
- }
6.判断顺序表是否为空,为空返回TRUE


- int Empty(List L)
- {
- if(L.length==)
- {
- return TRUE;
- }
- else
- {
- return FALSE;
- }
- }
7.显示顺序表


- void PrintList(List L)
- {
- for(int i=;i<L.length;i++)
- {
- printf("%d ",L.data[i]);
- }
- printf("\n");
- }
二.线性表的链式存储
- typedef int ElemType;
- typedef struct Node{
- ElemType data;
- struct Node *next;
- }Node;
0.完整代码


- #include <stdio.h>
- #include <stdlib.h>
- #define TRUE 1
- #define FALSE 0
- typedef int ElemType;
- typedef struct Node{
- ElemType data;
- struct Node *next;
- }Node;
- Node* InitNode();//初始化创建头结点
- Node* Node_HeadInsert(Node *L);//头插法建立链表
- Node* Node_TailInsert(Node *L);//尾插法建立链表
- Node* NodeInsert(Node *L,int i);//在第i个位置插入结点
- Node* NodeDelete(Node *L,int i);//删除第i个结点
- Node* NodeSearchNum(Node *L,int i);//按序号查找
- Node* NodeSearchValue(Node *L,ElemType x);//按值查找
- void PrintNode(Node *L);//显示单链表
- Node* NodeMerge(Node *p,Node *q);//合并两个递增链表
- int main()
- {
- Node *L;
- L=InitNode();
- L=Node_TailInsert(L);
- L=NodeInsert(L,);
- PrintNode(L);
- L=NodeDelete(L,);
- PrintNode(L);
- return ;
- }
- Node* InitNode()
- {
- Node *L;
- L=(Node*)malloc(sizeof(Node));
- L->next=NULL;
- return L;
- }
- Node* Node_HeadInsert(Node *L)
- {
- Node *s;
- ElemType x;
- scanf("%d",&x);//插入结点的值
- while(x!=)
- {
- s=(Node*)malloc(sizeof(Node));
- s->data=x;
- s->next=L->next;
- L->next=s;
- scanf("%d",&x);
- }
- return L;
- }
- Node* Node_TailInsert(Node *L)
- {
- ElemType x;
- Node *s,*r=L;
- scanf("%d",&x);
- while(x!=)
- {
- s=(Node*)malloc(sizeof(Node));
- s->data=x;
- r->next=s;
- r=s;
- scanf("%d",&x);
- }
- r->next=NULL;
- return L;
- }
- Node* NodeInsert(Node *L,int i)
- {
- ElemType x;
- Node *s,*p=NodeSearchNum(L,i-);
- printf("输入插入节点的值:") ;
- scanf("%d",&x);
- s=(Node*)malloc(sizeof(Node));
- s->data=x;
- s->next=p->next;
- p->next=s;
- printf("插入完成!\n");
- return L;
- }
- Node* NodeDelete(Node *L,int i)
- {
- Node *p,*q;
- p=NodeSearchNum(L,i-);
- q=p->next;
- p->next=q->next;
- free(q);
- printf("删除完成!\n");
- return L;
- }
- Node *NodeSearchNum(Node *L,int i)
- {
- int count=;//计数
- Node *p=L->next;
- if(i==)
- return L;
- if(i<)
- return NULL;
- while(p&&count<i)
- {
- p=p->next;
- count++;
- }
- return p;
- }
- Node *NodeSearchValue(Node *L,ElemType x)
- {
- Node *p=L->next;
- while(p&&p->data!=x)
- {
- p=p->next;
- }
- return p;
- }
- void PrintNode(Node *L)
- {
- Node *p=L->next;
- printf("单链表:");
- while(p)
- {
- printf("%d ",p->data);
- p=p->next;
- }
- printf("\n");
- }
- Node* NodeMerge(Node *p,Node *q)
- {
- Node *r,*t;
- r=InitNode();
- t=r;
- while(p->next&&q->next)
- {
- if(p->next->data<q->next->data)
- {
- t->next=p->next;
- p->next=p->next->next;
- t=t->next;
- }
- else
- {
- t->next=q->next;
- q->next=q->next->next;
- t=t->next;
- }
- }
- while(p->next)
- {
- t->next=p->next;
- p->next=p->next->next;
- t=t->next;
- }
- while(q->next)
- {
- t->next=q->next;
- q->next=q->next->next;
- t=t->next;
- }
- free(p);
- free(q);
- return r;
- }
1.初始化创建头结点


- Node* InitNode()
- {
- Node *L;
- L=(Node*)malloc(sizeof(Node));
- L->next=NULL;
- return L;
- }
2.头插法建立链表


- Node* Node_HeadInsert(Node *L)
- {
- Node *s;
- ElemType x;
- scanf("%d",&x);//插入结点的值
- while(x!=)
- {
- s=(Node*)malloc(sizeof(Node));
- s->data=x;
- s->next=L->next;
- L->next=s;
- scanf("%d",&x);
- }
- return L;
- }
3.尾插法建立链表


- Node* Node_TailInsert(Node *L)
- {
- ElemType x;
- Node *s,*r=L;
- scanf("%d",&x);
- while(x!=)
- {
- s=(Node*)malloc(sizeof(Node));
- s->data=x;
- r->next=s;
- r=s;
- scanf("%d",&x);
- }
- r->next=NULL;
- return L;
- }
4.在第i个位置插入结点


- Node* NodeInsert(Node *L,int i)
- {
- ElemType x;
- Node *s,*p=NodeSearchNum(L,i-);
- printf("输入插入节点的值:") ;
- scanf("%d",&x);
- s=(Node*)malloc(sizeof(Node));
- s->data=x;
- s->next=p->next;
- p->next=s;
- printf("插入完成!\n");
- return L;
- }
5.删除第i个结点


- Node* NodeDelete(Node *L,int i)
- {
- Node *p,*q;
- p=NodeSearchNum(L,i-);
- q=p->next;
- p->next=q->next;
- free(q);
- printf("删除完成!\n");
- return L;
- }
6.按序号查找


- Node *NodeSearchNum(Node *L,int i)
- {
- int count=;//计数
- Node *p=L->next;
- if(i==)
- return L;
- if(i<)
- return NULL;
- while(p&&count<i)
- {
- p=p->next;
- count++;
- }
- return p;
- }
7.按值查找


- Node *NodeSearchValue(Node *L,ElemType x)
- {
- Node *p=L->next;
- while(p&&p->data!=x)
- {
- p=p->next;
- }
- return p;
- }
8.显示单链表


- void PrintNode(Node *L)
- {
- Node *p=L->next;
- printf("单链表:");
- while(p)
- {
- printf("%d ",p->data);
- p=p->next;
- }
- printf("\n");
- }
9.合并两个递增链表


- Node* NodeMerge(Node *p,Node *q)
- {
- Node *r,*t;
- r=InitNode();
- t=r;
- while(p->next&&q->next)
- {
- if(p->next->data<q->next->data)
- {
- t->next=p->next;
- p->next=p->next->next;
- t=t->next;
- }
- else
- {
- t->next=q->next;
- q->next=q->next->next;
- t=t->next;
- }
- }
- while(p->next)
- {
- t->next=p->next;
- p->next=p->next->next;
- t=t->next;
- }
- while(q->next)
- {
- t->next=q->next;
- q->next=q->next->next;
- t=t->next;
- }
- free(p);
- free(q);
- return r;
- }
输出示例:
2020-06-27
线性表的顺序存储和链式存储c语言实现的更多相关文章
- 数据结构导论 四 线性表的顺序存储VS链式存储
前几章已经介绍到了顺序存储.链式存储 顺序存储:初始化.插入.删除.定位 链式存储:初始化.插入.删除.定位 顺序存储:初始化 strudt student{ int ID://ID char nam ...
- 算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)
温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结.数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下.当然数据结构相关博客中我们以Swift语言来实现.因为Swift ...
- 线性表的顺序存储和链式存储的实现(C)
//线性表的顺序存储 #include <stdio.h>typedef int DataType;#define MaxSize 15//定义顺序表typedef struct { Da ...
- 线性表的Java实现--链式存储(单向链表)
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素.由于不需要按顺序存储,链表在 ...
- c数据结构 -- 线性表之 复杂的链式存储结构
复杂的链式存储结构 循环链表 定义:是一种头尾相接的链表(即表中最后一个结点的指针域指向头结点,整个链表形成一个环) 优点:从表中任一节点出发均可找到表中其他结点 注意:涉及遍历操作时,终止条件是判断 ...
- 队列的顺序存储与链式存储c语言实现
一. 队列 1.队列定义:只允许在表的一端进行插入,表的另一端进行删除操作的线性表. 2.循环队列:把存储队列的顺序队列在逻辑上视为一个环. 循环队列状态: 初始时:Q.front=Q.rear=0 ...
- 栈的顺序存储和链式存储c语言实现
一. 栈 栈的定义:栈是只允许在一端进行插入或删除操作的线性表. 1.栈的顺序存储 栈顶指针:S.top,初始设为-1 栈顶元素:S.data[S.top] 进栈操作:栈不满时,栈顶指针先加1,再到栈 ...
- 线性表的Java实现--链式存储(双向链表)
有了单向链表的基础,双向链表的实现就容易多了. 双向链表的一般情况: 增加节点: 删除节点: 双向链表的Java实现: package com.liuhao.algorithm; publi ...
- C 数据结构1——线性表分析(顺序存储、链式存储)
之前是由于学校工作室招新,跟着大伙工作室招新训练营学习数据结构,那个时候,纯碎是小白(至少比现在白很多)那个时候,学习数据结构,真的是一脸茫然,虽然写出来了,但真的不知道在干嘛.调试过程中,各种bug ...
随机推荐
- Java实现 LeetCode 712 两个字符串的最小ASCII删除和(最长公共子串&&ASCII值最小)
712. 两个字符串的最小ASCII删除和 给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和. 示例 1: 输入: s1 = "sea", s2 ...
- Java实现 蓝桥杯 算法提高 三进制数位和
算法提高 三进制数位和 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 给定L和R,你需要对于每一个6位三进制数(允许前导零),计算其每一个数位上的数字和,设其在十进制下为S. 一个 ...
- Java实现 蓝桥杯VIP 算法提高 进制转换
算法提高 进制转换 时间限制:1.0s 内存限制:256.0MB 问题描述 程序提示用户输入三个字符,每个字符取值范围是0-9,A-F.然后程序会把这三个字符转化为相应的十六进制整数,并分别以十六进制 ...
- Java中输入时IO包与Scanner的区别
最常用的一个IO控制台输入的 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream ...
- Java实现第十届蓝桥杯迷宫
试题 E: 迷宫 本题总分:15 分 [问题描述] 下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方. 010000 000100 001001 110000 迷 ...
- java实现第九届蓝桥杯最大乘积
最大乘积 把 1~9 这9个数字分成两组,中间插入乘号, 有的时候,它们的乘积也只包含1~9这9个数字,而且每个数字只出现1次. 比如: 984672 * 351 = 345619872 98751 ...
- python自学Day06(自学书籍python编程从入门到实践)
第7章 用户输入和while循环 我们设计的程序大多是为了解决用户最终的问题,所以我们大多需要在用户那里获取一些信息. 学习用户输入的获取与处理,学习while循环让程序不断运行直到达到指定的条件不满 ...
- STL中的string
string常用函数 1.构造函数 string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 string类还支持默认构 ...
- 恕我直言,我怀疑你并不会用 Java 枚举
开门见山地说吧,enum(枚举)是 Java 1.5 时引入的关键字,它表示一种特殊类型的类,默认继承自 java.lang.Enum. 为了证明这一点,我们来新建一个枚举 PlayerType: p ...
- Jmeter(八) - 从入门到精通 - JMeter配置元件(详解教程)
1.简介 JMeter配置元件可以用来初始化默认值和变量,读取文件数据,设置公共请求参数,赋予变量值等,以便后续采样器使用.将在其作用域的初始化阶段处理.配置元件(Config Element)提供对 ...