c语言实现线性结构(数组与链表)
由于这两天看了数据结构,所以又把大学所学的c语言和指针"挂"起来了。
本人菜鸟一枚请多多指教。下面是我这两天学习的成果(数组和链表的实现,用的是c语言哦!哈哈)。
(一)数组的实现和操作。代码如下:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
struct Array{
int length;//数组长度
int * pBase;//存放数组首元素的地址
int cnt;//有效元素的个数
};
void init_arr(struct Array * pArray,int length);//初始化数组
bool append_arr(struct Array * pArray,int val);//向数组末尾添加元素
bool insert_arr(struct Array * pArray,int index,int val);//在数组的某个位置插入元素
bool delete_arr(struct Array * pArray,int index,int * deleteVal);//删除数组某个位置的元素
int get(struct Array * pArray, int index);//获取数组某个位置的元素
bool is_empty(struct Array * pArray);//判断数组是否为空
bool is_full(struct Array * pArray);//判断数组是否满了
void sort_arr(struct Array * pArray);//对数组进行排序
void show_arr(struct Array * pArray);//输出数组元素
void inversion_arr(struct Array * pArray);//倒置数组元素
void main(void){
struct Array array;
int deleteVal;
init_arr(&array,6);
append_arr(&array,22);
append_arr(&array,-22);
//append_arr(&array,3);
insert_arr(&array,2,333);
append_arr(&array,1);
append_arr(&array,33);
append_arr(&array,1);
append_arr(&array,-2);
show_arr(&array);
if(delete_arr(&array,2,&deleteVal)){
printf("删除的元素是%d\n",deleteVal);
}
show_arr(&array);
if(get(&array,4)!=-1){
printf("取出的元素为%d\n",get(&array,4));
}
sort_arr(&array);
show_arr(&array);
printf("-----\n");
inversion_arr(&array);
show_arr(&array);
}
//初始化数组
void init_arr(struct Array * pArray,int length){
pArray->pBase = (int *)malloc(sizeof(int)*length);
if(NULL == pArray->pBase){
printf("初始化数组失败\n");
exit(-1);
}else{
pArray->cnt = 0;
pArray->length = length;
}
}
//判断数组是否为空
bool is_empty(struct Array * pArray){
if(pArray->cnt == 0){
return true;
}else{
return false;
}
}
//判断数组是否满了
bool is_full(struct Array * pArray){
if(pArray->cnt == pArray->length){
return true;
}else{
return false;
}
}
//向数组末尾添加元素
bool append_arr(struct Array * pArray,int val){
if(!is_full(pArray)){
pArray->pBase[pArray->cnt]= val;
(pArray->cnt)++;
return true;
}
else{
//printf("数组已满无法插入\n");
return false;
}
}
//输出数组元素
void show_arr(struct Array * pArray){
if(is_empty(pArray)){
printf("数组为空\n");
}else{
for(int i=0;i<pArray->cnt;i++){
printf("%d\n",pArray->pBase[i]);
}
}
}
//在数组的某个位置插入元素
bool insert_arr(struct Array * pArray,int index,int val){
if(index>(pArray->cnt)+1 || index<=0 || index==pArray->length || is_full(pArray)){
return false;
}else{
for(int i=pArray->cnt-1;i>=index-1;i--){
pArray->pBase[i+1] = pArray->pBase[i];
}
pArray->pBase[index-1] = val;
pArray->cnt++;
return true;
}
}
//删除数组某个位置的元素
bool delete_arr(struct Array * pArray,int index,int * deleteVal){
if(index<=0 || index>pArray->cnt || is_empty(pArray)){
return false;
}else{
*deleteVal = pArray->pBase[index-1];
for(int i = index;i<pArray->cnt;i++)
{
pArray->pBase[i-1] = pArray->pBase[i];
}
pArray->cnt--;
return true;
}
}
//获取数组某个位置的元素
int get(struct Array * pArray,int index){
if(index<=0 || is_empty(pArray) || index > pArray->cnt){
return -1;
}else{
return pArray->pBase[index-1];
}
}
//对数组进行排序
void sort_arr(struct Array * pArray){
if(is_empty(pArray)){
printf("此数组为空不能排序\n");
}else{
int t;
for(int i = 0;i<pArray->cnt-1;i++){
for(int j = i+1;j<pArray->cnt;j++){
if(pArray->pBase[j]<pArray->pBase[i]){
t = pArray->pBase[i];
pArray->pBase[i] = pArray->pBase[j];
pArray->pBase[j] = t;
}
}
}
}
}
//倒置数组元素
void inversion_arr(struct Array * pArray){
if(!is_empty(pArray) || !pArray->cnt ==1){
int i = 0;
int j = pArray->cnt-1;
int t;
while(i<j){
t = pArray->pBase[i];
pArray->pBase[i] = pArray->pBase[j];
pArray->pBase[j] = t;
i++;
j--;
}
}
}
运行结果如下:
(二)链接的实现和操作。代码如下:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct Node{
int data;
Node * pNext;
}NODE,*PNODE;
//初始化链表
PNODE createList(int);
//遍历链表
void traverse_list(PNODE);
//判断链表是否为空
bool is_empty(PNODE);
//返回链表的长度
int length_list(PNODE);
//向链表中插入节点
bool insert_list(PNODE,int,int);
//删除某个节点
bool delete_list(PNODE,int,int *);
//为链表排序
void sort_list(PNODE);
//主函数
void main(void){
int leng;
PNODE pHead;
int val;
printf("请您输入链表的长度\n");
scanf("%d",&leng);
pHead = createList(leng);
//traverse_list(pHead);
if(is_empty(pHead)){
printf("链表为空\n");
}
//printf("链表的长度为%d\n",length_list(pHead));
//sort_list(pHead);
insert_list(pHead,3,111);
traverse_list(pHead);
if(delete_list(pHead,3,&val)){
printf("删除的节点为%d\n",val);
}
traverse_list(pHead);
}
//初始化链表
PNODE createList(int leng){
PNODE pHead;
pHead = (NODE *)malloc(sizeof(NODE));
if(NULL == pHead){
printf("初始化链表失败\n");
exit(-1);
}
PNODE pTail = pHead;
pTail->pNext = NULL;
for(int i=1;i<=leng;i++){
int val;
PNODE pNew = (NODE *)malloc(sizeof(NODE));
printf("请输入第%d个值:",i);
scanf("%d",&val);
pNew->data = val;
pNew->pNext = NULL;
pTail->pNext = pNew;
pTail = pNew;
}
return pHead;
}
//遍历链表
void traverse_list(PNODE pHead){
PNODE p = pHead;
if(p->pNext == NULL){
printf("链表为空\n");
}
while(p->pNext != NULL){
p = p->pNext;
printf("%d\n",p->data);
}
}
//判断链表是否为空
bool is_empty(PNODE pHead){
if(pHead->pNext == NULL){
return true;
}else{
return false;
}
}
//返回链表的长度
int length_list(PNODE pHead){
PNODE p = pHead;
int leng = 0;
while(p->pNext != NULL){
p = p->pNext;
leng++;
}
return leng;
}
//向链表中插入节点
bool insert_list(PNODE pHead,int index,int val){
int i = 0;
PNODE p = pHead;
while(p->pNext!=NULL && i<index-1){
p = p->pNext;//p->1;p->2
i++;//1;2
}
if(p->pNext == NULL || i>index-1){
return false;
}
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(pNew == NULL){
printf("初始化节点失败\n");
exit(-1);
}
pNew->data = val;
pNew->pNext = p->pNext;
p->pNext = pNew;
return true;
}
//删除某个节点
bool delete_list(PNODE pHead,int index,int * val){
int i = 0;
PNODE p = pHead;
while(p->pNext!=NULL && i<index-1){
p = p->pNext;//p->1;p->2
i++;//1;2
}
if(p->pNext == NULL || i>index-1){
return false;
}
PNODE delNode = p->pNext;
*val = delNode->data;
p->pNext = delNode->pNext;
free(delNode);
return true;
}
//为链表排序
void sort_list(PNODE pHead){
int t,i,j;
PNODE p,q;
for(i=0,p = pHead;i<length_list(pHead);i++,p=p->pNext){
for(j=i+1,q = p->pNext;j<=length_list(pHead);j++,q = q->pNext){
if(p->data > q->data){
t = p->data;
p->data = q->data;
q->data = t;
}
}
}
}
运行结果如下:
转载于:https://blog.51cto.com/zhuangyong/1890230
相关文章:

OTSU 二值化的实现
#include <stdio.h> #include <string> #include "opencv2/highgui/highgui.hpp" #include "opencv2/opencv.hpp" using namespace std; using namespace cv; // 大均法函数实现 int OTSU(cv::Mat srcImage) {int nCols srcImage.cols;int nR…

vivo7.0系统机器(亲测有效)激活Xposed框架的教程
对于喜欢搞机的机友来说,常常会使用到Xposed框架和种种功能牛逼的模块,对于5.0以下的系统版本,只要手机能获得Root权限,安装和激活Xposed框架是异常轻松的,但随着系统版本的升级,5.0以后的系统,…

【OpenCV 】反向投影
目录 1 目标 2原理:什么是反向投影? 3 代码实现 4 实现结果 1 目标 什么是反向投影,它可以实现什么功能? 如何使用OpenCV函数 calcBackProject 计算反向投影? 如何使用OpenCV函数 mixChannels 组合图像的不同通道…
Linux编程之自定义消息队列
我这里要讲的并不是IPC中的消息队列,我要讲的是在进程内部实现自定义的消息队列,让各个线程的消息来推动整个进程的运动。进程间的消息队列用于进程与进程之间的通信,而我将要实现的进程内的消息队列是用于有序妥当处理来自于各个线程请求&am…

threshold 二值化的实现
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" int main( ) {// 读取源图像及判断cv::Mat srcImage cv::imread("..\\images\\hand1.jpg");if( !srcImage.data ) return 1;// 转化为灰度图像cv::Mat srcGray…

如何定时备份数据库并上传七牛云
前言: 这篇文章主要记录自己在备份数据库文件中踩的坑和解决办法。 服务器数据库备份文件之后上传到七牛云 备份数据库文件在服务器根目录下 创建 /backup/qiniu/.backup.sh #!/bin/bash# vuemall 数据库名称 # blog_runner vuemall 的管理用户# admin vuem…

【OpenCV 】计算物体的凸包/创建包围轮廓的矩形和圆形边界框/createTrackbar添加滑动条/
目录 topic 1:模板匹配 topic 2:图像中寻找轮廓 topic 3:计算物体的凸包 topic 4:轮廓创建可倾斜的边界框和椭圆 topic 5:轮廓矩 topic 6:为程序界面添加滑动条 3.1 目标 3.2 代码实例1 3.3 代码实例2 3.4 实例3运行结果 3.5 运行结果 topic 1:模板匹配 topic 2:图…

开源:Angularjs示例--Sonar中项目使用语言分布图
在博客中介绍google的Angularjs 客户端PM模式框架很久了,今天发布一个关于AngularJs使用是简单示例SonarLanguage(示例位于Github:https://github.com/greengerong/SonarLanguage)。本项目只是一个全为客户端的示例项目。项目的初始是我想看看在公司的项…

adaptiveThreshold 阈值化的实现
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" int main( ) {// 图像读取及判断cv::Mat srcImage cv::imread("..\\images\\hand1.jpg");if( !srcImage.data ) return 1;// 灰度转换cv::Mat srcGray;cv::cvt…

hashMap传入参数,table长度为多少
前言 我的所有文章同步更新与Github--Java-Notes,想了解JVM,HashMap源码分析,spring相关,剑指offer题解(Java版),可以点个star。可以看我的github主页,每天都在更新哟。 邀请您跟我一同完成 rep…

【OpenCV】图像/视频相似度测量PSNR( Peak signal-to-noise ratio) and SSIM,视频/图片转换
目录 1 目标 2 原理 2.1 图像比较 - PSNR and SSIM 3 代码 3.1如何读取一个视频流(摄像头或者视频文件)? 3 运行效果 视频/图片转换: 如何用OpenCV创建一个视频文件用OpenCV能创建什么样的视频文件如何释放视频文件当中的某个颜色通道…

struts2提交list
2019独角兽企业重金招聘Python工程师标准>>> Action: private List<User> users; jsp: <input type"text" name"users[0].name" value"aaa" /> <input type"text" name"users[1].name" value&q…

双阈值法的实现
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" int main( ) {// 图像读取及判断cv::Mat srcImage cv::imread("..\\images\\hand1.jpg");if( !srcImage.data ) return 1;// 灰度转换cv::Mat srcGray;cv::cvt…

设计模式 小记
观察者模式 1.被观察者是单例模式。 生成这模式 1.Director中对于Builder的引用不一定是Strong,根据情况也有可能是Copy。 2.Director 聚合 Builder, 所以Builder本身可以单独拿出来使用。 转载于:https://juejin.im/post/5ca8c24df265da3094116c18

【MATLAB】————matlab raw图转bmp实现
image_path [layer_3_list_folder,\,layer_3_list_name]; img_raw_path fopen(image_path,r);%%打开图像 img_raw fread(img_raw_path,[Width,Height],uint16);% uchar为无符号字符型 mg_raw uint8(img_raw);%%unit8表示无符号整数,范围0-255,u…

人工手动冷备不完全恢复介绍(purge表不完全恢复)
不完全恢复不完全恢复的基本类型:1)基于时间点 (until time): 使整个数据库恢复到过去的一个时间点前2)基于scn (until change): 使整个数据库恢复到过去的某个SCN前3)基于cancel (u…

半阈值法的实现
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <iostream> using namespace std; using namespace cv; int main( ) {// 读取源图像及判断cv::Mat srcImage cv::imread("..\\images\\hand1.jpg&q…

novaclient的api调用流程与开发
novaclient的api调用流程与开发 2015年07月05日 19:27:17 qiushanjushi 阅读数:3915 http://blog.csdn.net/tpiperatgod/article/details/18375387?utm_sourcetuicool 另一个地址:http://neuromancer.sinaapp.com/?p64 从nova client的入口查看 cat /u…

【C++】 保存内容到文件工具
1. c 输出到文件 // save mean distance between center and descriptorsstd::string filename configuration_.debug_output_path() "ref_max_mean_distance.txt";FILE* fp fopen(filename.c_str(), "w");try {if (fp nullptr) {return error::Failed…

你知道实习对你有多重要吗?
大学生就业一直是个永恒不变的话题,在过去几年中,每次临近毕业季,我们肯定会一次次的听到“史上最难就业季”之说。而每一年的数据也会不断突破前一年的数字。在国新办举行的新闻发布会上,人力资源社会保障部部长尹蔚民提到…

灰度直方图的实现
#include <opencv2\opencv.hpp> int main() {// 图像源获取及判断 cv::Mat Image, ImageGray;Image cv::imread("..\\images\\flower3.jpg"); if(Image.empty()) return -1;cv::imshow("Image",Image);// 转换为灰度图像cv::cvtColor(Image,Image…

Android笔记之ViewModel的使用示例
依赖 implementation android.arch.lifecycle:extensions:1.1.1 implementation com.squareup.retrofit2:retrofit:2.5.0 implementation com.squareup.retrofit2:converter-gson:2.5.0 implementation com.squareup.retrofit2:adapter-rxjava2:2.5.0 implementation io.reacti…

vscode配置记录
vscode配置记录 按照官网教程安装好vs:实际上只需要配置launch.json的”program“如下所示 "configurations": [{"name": "(gdb) Launch","type": "cppdbg","request": "launch","program":…

unity 2d 游戏优化之路 遇坑记录
情景说明: unity 出的Android包,在目前一些主流机型跑都没有问题,但是在 小米3 这种比较老的机器上跑,报如下错误 GLSL compilation failed, no infolog provided 起先,我们一直以为是在低端机器上某个特定的GLSL 在这…

自定义直方图实现
#include <opencv2/opencv.hpp> int main() {// 图像获取及判断cv::Mat srcImage cv::imread("..\\images\\flower3.jpg");if( !srcImage.data ) return 1;cv::imshow("srcImage",srcImage);// 灰度转换 cv::Mat srcGray;cv::cvtColor(srcImage,sr…

js数组指定位置添加删除
示例参考:http://www.w3school.com.cn/jsref/jsref_splice.asp转载于:https://www.cnblogs.com/CarryYou-lky/p/10669859.html

【C++】对象实例化/成员函数/成员变量的内存管理
文章目录1. 对象实例化的内存管理总结2.C成员函数在内存中的存储方式3.C类的实例化对象的大小之sizeof()实例一:实例二:实例三:实例四:实例五:实例六:实例七:实例八:实例九ÿ…

HTML form 标签的 enctype 属性
1. enctype 的定义和用法 enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。 默认地,表单数据会编码为 "application/x-www-form-urlencoded"。 就是说,在发送到服务器之前,所有字符都会进行编码(空格转…

灰度直方图均衡化实现
#include <opencv2/opencv.hpp> int main() {cv::Mat srcImage cv::imread("..\\images\\flower3.jpg");if( !srcImage.data ) return 1;cv::Mat srcGray;cv::cvtColor(srcImage, srcGray, CV_BGR2GRAY);cv::imshow("srcGray", srcGray);// 直方图均…

oracle汉化包下载地址
2019独角兽企业重金招聘Python工程师标准>>> https://www.allroundautomations.com/bodyplsqldevreg.html 转载于:https://my.oschina.net/u/3141521/blog/3034655