线性表的顺序存储和链式存储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 ...
随机推荐
- 第二届蓝桥杯C++B组国(决)赛真题
以下代码仅供参考,解答部分来自网友,对于正确性不能保证,如有错误欢迎评论 四方定理. 数论中有著名的四方定理:所有自然数至多只要用四个数的平方和就可以表示. 我们可以通过计算机验证其在有限范围的正确性 ...
- Java实现 蓝桥杯 历届试题幸运数
问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然数1,2,3,4,5,6,- 1 就是第一个幸运数. 我们从2这个数开始.把所 ...
- java实现串的反转
串的反转 反转串 我们把"cba"称为"abc"的反转串. 求一个串的反转串的方法很多.下面就是其中的一种方法,代码十分简洁(甚至有些神秘),请聪明的你通过给出 ...
- wtf.sh-150
前言: 最近在刷ctf题,在理解了大佬们的wp后自己做完之后,从头到尾把思路过了一遍,做次记录为以后复习和打比赛做准备,同时也希望能帮到别人. 0x01 进入网址,发现是一个论坛,有注册,登录和发表的 ...
- Windows下虚拟机Linux(CentOS8)扩容设置 - 磁盘扩容中的坑和解决方法
摘要:[原创]转载请注明作者Johnthegreat和本文链接 由于虚拟机空间不足,为了避免重装虚拟机,做了一次无损扩容. 过程中的报错如下: [root@localhost ~]# pvcrea ...
- 【1】Vim 进阶操作
一.标签 :tabnew one.c 新建标签[♥] 常用 :tabc 关闭文件 :tabp 切换前一个页面 :tabn 切换下一个页面 gt 普通模式下操作 常用 二.窗口 :sp 水平 ...
- [julia][学习笔记]julia的安装
目录 julia的安装 下载地址 下载后安装 IDE Julia Pro 安装方法 使用方法(以hello world为例) vscode的Julia插件 下载vscode 安装vscode Juli ...
- 问题解决:psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
错误提示: psql: could not connect to server: No such file or directory Is the server running locally and ...
- Ultra-QuickSort (求逆序数+离散化处理)、Cows、Stars【树状数组】
一.Ultra-QuickSort(树状数组求逆序数) 题目链接(点击) Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total ...
- 并发系列(一)——线程池源码(ThreadPoolExecutor类)简析
前言 本文主要是结合源码去线程池执行任务的过程,基于JDK 11,整个过程基本与JDK 8相同. 个人水平有限,文中若有表达有误的,欢迎大伙留言指出,谢谢了! 一.线程池简介 1.1 使用线程池的优点 ...