C语言静态与动态通讯录的实现流程详解

目录
  • 静态通讯录
    • contact.h
    • contact.c
    • test.c
  • 动态通讯录
    • contact.h
    • contact.c
    • qsort.c
    • test.c

本次通讯录的代码已经放到我的Gitee仓库中,感兴趣的小伙伴可以去看看

Gitee

静态通讯录

在我们学习完C语言的结构体、指针以及动态内存管理之后,我们就可以实现一些有意思的小项目了,通过这些小项目可以加深我们对于相关知识的理解。

静态通讯录主要要求有

  • 静态大小,可以记录10个人的信息(大小自己定)
  • 记录的信息如下:名字、性别、年龄、电话、住址
  • 可以实现联系人的增删查改

为了方便代码的管理和维护,我们分文件实现以上的要求

  • contact.h 用于声明相关的接口
  • contact.c 用于实现相关的接口
  • test.c 用于测试相关的接口

contact.h

在contact.h中,我们统一用预处理指令来确定好通讯录的大小,以及每一个联系人信息的范围大小,方便后续的修改

在确定好范围后,我们通过定义结构体类型的方式来实现对数据的统一管理

结构体类型确定后,就是相关接口的声明了

//首先引入需要用到的头文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//确定每一个联系人名字、电话等信息的范围大小
#define MAX_NAME 10
#define MAX_PHONE 20
#define MAX_ADDR 25

// 确定通讯录的总大小
#define MAX_CAPACITY 10

//由于每一个联系人都有多个信息,因此需要定义一个结构体类型来管理
//定义联系人相关信息的结构体
 typedef struct PeoInfo {

	char name[MAX_NAME];
	char sex;
	int  age;
	char phone[MAX_PHONE];
	char address[MAX_ADDR];

}peo;

//通讯录内包含多个成员,因此也需要统一管理,所以还是使用结构体
 //定义一个通讯录结构体,管理通讯录和记录有效联系人个数信息
typedef struct Contact {

	peo data[MAX_CAPACITY];//这里是一个数组,数组的每一个元素都是一个结构体
	int size;
}con;

//------------------------------------------------------
//以下是相关接口的声明

//菜单接口
void menu();

//对结构体变量进行初始化
void InitContact(con* con);

//打印通讯录信息
void Print(con* con);

//实现增加联系人的接口
void AddContact(con* con);

//实现删除联系人的接口
void DelContact(con* con);

//实现查找联系人的接口
void SearchContact(con* con);

//实现修改联系人的接口
void ModifyContact(con* con);

contact.c

contact.c是整个项目的关键,需要对相关接口进行定义

//通讯录各个接口的实现
//首先引入.h文件
#include"Contact.h"

//菜单接口
void menu() {

	printf("*******************************\n");
	printf("********静态简易通讯录*********\n");
	printf("*******   0.退出通讯录   ******\n");
	printf("*******   1.增加联系人   ******\n");
	printf("*******   2.删除联系人   ******\n");
	printf("*******   3.查找联系人   ******\n");
	printf("*******   4.修改联系人   ******\n");
	printf("*******   5.打印联系人   ******\n");
	printf("*******************************\n");
	printf("\n");

}

//对结构体变量进行初始化
void InitContact(con* con) {

	//结构体的初始化一般用memset
	//我们首先让通讯录结构体变量的数组一开始为0
	memset(con->data, 0, sizeof(con->data));

	con->size = 0;//同时由于此时一个联系人的信息都没有,所以size也是0
}

//打印通讯录信息
void Print(con* con){
	int i = 0;
	if (con->size == 0) {
		printf("暂无可打印信息\n");
		return ;
	}
	printf("name\tsex\tage\tphone\taddress\n");
	for (i = 0; i < con->size; i++) {
		printf("%s\t%c\t%d\t%s\t%s\n",
			con->data[i].name, con->data[i].sex,
			con->data[i].age, con->data[i].phone, con->data[i].address);
	}

}

//实现增加联系人的接口
void AddContact(con* con) {
	if (con->size == MAX_CAPACITY) {

		printf("容量已满,无法增加\n");
		return;
	}

	printf("请输入姓名:\n");
	scanf("%s", con->data[con->size].name);

	getchar();

	printf("请选择性别:(m表示男,w表示女)\n");
	scanf("%c", &(con->data[con->size].sex));

	printf("请输入年龄:\n");
	scanf("%d", &(con->data[con->size].age));

	printf("请输入手机号码:\n");
	scanf("%s", con->data[con->size].phone);

	printf("请输入住址:\n");
	scanf("%s", con->data[con->size].address);

	con->size++;
}

//实现删除联系人的接口
void DelContact(con* con) {

	if (con->size == 0) {
		printf("暂无可以删除的信息");
		return;
	}

	printf("请输入你要删除的联系人的姓名:\n");
	char name[MAX_NAME] = {0};

	scanf("%s", name);
	int i = 0;
	for (i = 0; i < con->size; i++) {
		if (strcmp(name, (con->data)[i].name) == 0) {
			int j = 0;
			for (j = i; j < con->size - 1; j++) {
				memmove(&(con->data[j]), &(con->data[j + 1]), sizeof(con->data[0]));
			}
			con->size--;
			return;

		}
	}
	printf("你输入的联系人不存在\n");

}

//实现查找联系人的接口
void SearchContact(con* con) {

	if (con->size == 0) {
		printf("暂无查找的信息");
		return;
	}

	printf("请输入你要查找的联系人的姓名:\n");
	char name[MAX_NAME] = { 0 };

	scanf("%s", name);
	int i = 0;
	for (i = 0; i < con->size; i++) {
		if (strcmp(name, (con->data)[i].name) == 0) {
			printf("%s\t%c\t%d\t%s\t%s\n",
				con->data[i].name, con->data[i].sex,
				con->data[i].age, con->data[i].phone, con->data[i].address);
			return;

		}
	}
	printf("你想要查找的联系人不存在\n");
}

//实现修改联系人的接口
void ModifyContact(con* con) {

	if (con->size == 0) {
		printf("暂无可以修改的信息");
		return;
	}

	printf("请输入你要修改的联系人的姓名:\n");
	char name[MAX_NAME] = { 0 };

	scanf("%s", name);
	int i = 0;
	for (i = 0; i < con->size; i++) {
		if (strcmp(name, (con->data)[i].name) == 0) {

			printf("请重新输入姓名:\n");
			scanf("%s", con->data[i].name);

			getchar();

			printf("请重新选择性别:(m表示男,w表示女)\n");
			scanf("%c", &(con->data[i].sex));

			printf("请重新输入年龄:\n");
			scanf("%d", &(con->data[i].age));

			printf("请重新输入手机号码:\n");
			scanf("%s", con->data[i].phone);

			printf("请重新输入住址:\n");
			scanf("%s", con->data[i].address);
			return;

		}
	}
	printf("你想要修改的联系人不存在\n");

}

提示

我们在实现接口的时候,如果形参传入的是指针,一般都需要先判断一下传入的指针是否为空指针,以免造成非法访问,但是由于我的疏忽,就没有写上去了!

test.c

test.c就是用来测试相关接口的文件,可以根据自己的想法来设定

#include"Contact.h"

int main() {

	//创建结构体并且初始化
	con c;
	InitContact(&c);

	menu();
	int input = 0;

	while (1) {

		printf("请输入你的选择:\n");
		scanf("%d", &input);

		switch (input) {
		case 1:
			AddContact(&c);
			break;
		case 2:
			DelContact(&c);
			break;
		case 3:
			SearchContact(&c);
			break;
		case 4:
			ModifyContact(&c);
			break;
		case 5:
			Print(&c);
			break;
		case 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("你的输入有误,请重新选择\n");
			break;

		}

		if (input == 0) {
			break;
		}
	}

	return 0;
}

动态通讯录

静态通讯录有一个缺点,那就是通讯录的大小,也就是只能存储的联系人是要求确定大小的,大小给多了浪费空间,给少了又不够用。

动态通讯录就是通过动态内存管理的函数来实现动态开辟空间大小,以满足需要的。

contact.h

//动态版本通讯录的实现

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX_NAME 15
#define MAX_PHONE 15
#define MAX_ADDR 25

//给定通讯录默认大小为5,不够可以增容
#define DefaultSize 5

//联系人结构体的声明
typedef struct PeoInfo {

	char name[MAX_NAME];
	char sex;
	short age;
	char phone[MAX_PHONE];
	char addr[MAX_ADDR];

}peo;

//通讯录结构体的声明
typedef struct Contact {

	peo* p;//我们通过指针的方式来管理联系人数组
	int capacity;
	int size;
}con;

//菜单函数
void menu();

//初始化通讯录
void InitCon(con* c);

//销毁通讯录
void DestoryCon(con* c);

//检查容量的接口
void CheckCapacity(con* c);

//打印联系人信息
void Print(con* c);

//联系人的增加
void AddCon(con* c);

//联系人的删除
void DelCon(con* c);

//联系人的查找
void SearchCon(con* c);

//联系人的修改
void ModifyCon(con* c);

//-------------------------------------------
//下面是我通过快排的原理,手写的快排来实现一下通过联系人名字和年龄排序的接口

//通过名字来排序
void SortByname(con* c);

//通过年龄来排序
void SortByage(con* c);

void Swap(char* p1, char* p2, int width);

void QSort(void* p, int num, int width, int(*cmp)(const void* , const void* ));

int cmpbyname(const void* p1,const void* p2);

int cmpbyage(const void* p1,const void* p2);

contact.c

关键接口的实现和静态通讯录的大同小异,只不过我们需要多定义一个检查空间的接口

每次增加联系人的时候,就调用这个接口,做到满了就增容

其中增容接口使用的时realloc函数

#include"contact.h"

//菜单函数
void menu() {

	printf("******************************************\n");
	printf("*************   动态版通讯录   ***********\n");
	printf("*************   1.增加联系人   ***********\n");
	printf("*************   2.删除联系人   ***********\n");
	printf("*************   3.查找联系人   ***********\n");
	printf("*************   4.修改联系人   ***********\n");
	printf("*************   5.按名字排序   ***********\n");
	printf("*************   6.按年龄排序   ***********\n");
	printf("*************   7.打印联系人   ***********\n");
	printf("*************   0.退出通讯录   ***********\n");
	printf("******************************************\n");

}

//初始化通讯录
void InitCon(con* c) {

	//这里也可以用relloc函数来初始化,这样的话就会有初始值
	c->p = (con*)malloc(DefaultSize * sizeof(peo));
	c->capacity = DefaultSize;
	c->size = 0;
}

//销毁通讯录
void DestoryCon(con* c) {

	free(c->p);
	c->p = NULL;
	c->capacity = 0;
	c->size = 0;

}

//检查容量的接口
void CheckCapacity(con* c) {

	if (c->capacity == c->size) {

		//每次增容二倍
		peo* tmp = (peo*)realloc(c->p, 2 * (c->capacity) * sizeof(peo));
		if (tmp != NULL) {
			c->p = tmp;
			c->capacity = 2 * c->capacity;
			printf("增容成功\n");
		}
		else {
			printf("增容失败\n");
			exit(1);
		}
	}
}

//打印联系人信息
void Print(con* c) {

	if (c->size == 0) {
		printf("暂无可以打印的信息\n");
		return;
	}

	printf("name\tsex\tage\tphone\taddress\n");

	int i = 0;
	for (i = 0; i < c->size; i++) {
		printf("%s\t%c\t%d\t%s\t%s\n",
			c->p[i].name, c->p[i].sex, c->p[i].age, c->p[i].phone, c->p[i].addr);

	}
}

//联系人的增加
void AddCon(con* c) {

	//每一次增加联系人都要先检查容量是否足够
	CheckCapacity(c);

	printf("请输入名字:>\n");
	scanf("%s", c->p[c->size].name);
	getchar();
	printf("请输入性别:>(m表示男,w表示女)\n");
	scanf("%c", &(c->p[c->size].sex));
	printf("请输入年龄:>\n");
	scanf("%d", &(c->p[c->size].age));
	printf("请输入电话:>\n");
	scanf("%s", c->p[c->size].phone);
	printf("请输入地址:>\n");
	scanf("%s", c->p[c->size].addr);

	c->size++;
	printf("添加成功\n");
}

//联系人的删除
void DelCon(con* c) {

	printf("请输入你想要删除的联系人的名字\n");
	char name[MAX_NAME];
	scanf("%s", name);

	int i = 0;
	for (i = 0; i < c->size; i++) {

		if (strcmp(name, c->p[i].name) == 0) {

			int j = i;
			for (j = i; j < c->size - 1; j++) {
				memmove(&(c->p[j]), &(c->p[j + 1]), sizeof(c->p[0]));
			}
			c->size--;
			return;
		}

	}

	printf("你想要删除的联系人不存在\n");
}

//联系人的查找
void SearchCon(con* c) {

	printf("请输入你想要查找的人的名字:\n");
	char name[MAX_NAME];
	scanf("%s", name);

	int i = 0;
	for (i = 0; i < c->size; i++) {

		if (strcmp(name, c->p[i].name) == 0) {

			printf("%s\t%c\t%d\t%s\t%s\n",
				c->p[i].name, c->p[i].sex, c->p[i].age, c->p[i].phone, c->p[i].addr);
			return;
		}

	}

	printf("你想要查找的联系人不存在\n");

}

//联系人的修改
void ModifyCon(con* c) {

	printf("请输入你想要修改的人的名字:\n");
	char name[MAX_NAME];
	scanf("%s", name);

	int i = 0;
	for (i = 0; i < c->size; i++) {

		if (strcmp(name, c->p[i].name) == 0) {

			printf("请重新输入名字:>\n");
			scanf("%s", c->p[i].name);
			getchar();
			printf("请重新输入性别:>(m表示男,w表示女)\n");
			scanf("%c", &(c->p[i].sex));
			printf("请重新输入年龄:>\n");
			scanf("%d", &(c->p[i].age));
			printf("请重新输入电话:>\n");
			scanf("%s", c->p[i].phone);
			printf("请重新输入地址:>\n");
			scanf("%s", c->p[i].addr);
			return;
		}

	}

	printf("你想要修改的联系人不存在\n");

}

//通过名字来排序
void SortByname(con* c) {

	QSort(c->p, c->size, sizeof(c->p[0]),cmpbyname );

}

//通过年龄来排序
void SortByage(con* c) {

	QSort(c->p, c -> size, sizeof(c->p[0]), cmpbyage);

}

qsort.c

这是我根据快速排序的原理,手写的快速排序

#include"contact.h"

//快排的交换函数
void Swap(char* p1, char* p2, int width) {

	int i = 0;
	for (i = 0; i < width; i++) {
		char tmp = *p1;
		*p1 = *p2;
		*p2 = tmp;
		p1++;
		p2++;
	}

}

//手写快排来进行通讯录排序
void QSort(void* p, int num, int width, int(*cmp)(const void*, const void*)) {

	int i = 0;
	for (i = 0; i < num - 1; i++) {

		int j = 0;
		for (j = 0; j < num - 1 - i; j++) {

			if (cmp((char*)p + j * width, (char*)p + (j + 1) * width) > 0) {
				Swap((char*)p + j * width, (char*)p + (j + 1) * width, width);
			}
		}

	}
}

int cmpbyage(const void* p1, const void* p2) {

	return (*(peo*)p1).age - (*(peo*)p2).age;
}

int cmpbyname(const void* p1, const void* p2) {

	return strcmp(((peo*)p1)->name,((peo*)p2)->name);
}

test.c

test.c用于测试相关的接口,可以根据自己的想法来测试

#include"contact.h"

int main() {

	menu();
	int input = 0;

	con c;
	InitCon(&c);

	while (1) {

		printf("请输入你的选择:\n");
		scanf("%d", &input);

		switch (input) {
		case 1:
			AddCon(&c);
			break;
		case 2:
			DelCon(&c);
			break;
		case 3:
			SearchCon(&c);
			break;
		case 4:
			ModifyCon(&c);
			break;
		case 5:
			SortByname(&c);
			break;
		case 6:
			SortByage(&c);
			break;
		case 7:
			Print(&c);
			break;
		case 0:
			printf("退出通讯录\n");
			break;

		}
		if (input == 0) {
			DestoryCon(&c);
			break;
		}
	}

	return 0;
}

到此这篇关于C语言静态与动态通讯录的实现流程详解的文章就介绍到这了,更多相关C语言 通讯录内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

到此这篇关于C语言静态与动态通讯录的实现流程详解的文章就介绍到这了,更多相关C语言 通讯录内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言模拟实现动态通讯录

    目录 1.模拟实现通讯录总体架构一览图 2.文件执行任务 3.分模块实现 测试模块 test.c 头文件 功能函数声明 contact.h 功能函数逐一实现 1.模拟实现通讯录总体架构一览图 2.文件执行任务 3.分模块实现 测试模块 test.c 1.为了更好地展示,制作一个菜单,在菜单中有 添加,删除,查找,修改,排序,清空,退出的选项. 2.因为起先要进入程序一趟,所以用do····while循环(输入选项来看具体操作,退出还是其他操作) #include "contact.h"

  • C语言实现通讯录管理系统

    本文实例为大家分享了C语言实现通讯录管理系统的具体代码,供大家参考,具体内容如下 工具:Visual C++6.0 说明: 本系统基于C语言实现班级通讯录管理系统,为大一时学习C语言刚入门所做的课程设计.功能包括增.删.查.改等,非常适合初学者练手.通讯录包括的个人信息有姓名.学号.性别.籍贯.政治面貌.手机号.QQ号.宿舍等.主要用到了指针.结构体.遍历链表.文件读取等知识点. 运行效果: 代码: #include<stdio.h> #include<string.h> #inc

  • C语言实现通讯录的方法(包括静态版本和动态版本)

    目录 1.静态通讯录的实现 实现的方法: 2.动态通讯录的实现 实现的方法: 3.总结 1.静态通讯录的实现 实现的方法: 我们采用的方法就是工程形势,实现将功能和定义以及测试分成三个文件,其中定义放在.h文件,实现和测试放在.c文件当中. (1)contact.h文件的基本实现: #pragma once//防止头文件重复定义 #define NAME_MAX 20 #define SEX_MAX 5 #define TELE_MAX 12 #define ADDR_MAX 30 #defin

  • 详解C语言之实现通讯录

    目录 基本思路和代码实现 其他探讨 总结 基本思路和代码实现 为了代码清晰易读,我们创建一个Main.c源文件用来实现代码的基本逻辑.创建一个Contact.h源文件用于封装实现功能的函数,创建Contact.h头文件用于函数的声明. 首先就是构架代码基本框架,在主函数中实现打印菜单和循环的功能 (这里为了好截图switch里的语句缩进得比较紧凑) 基本逻辑实现后开始考虑创建通讯录,通讯录里会记录人的信息.所以要先能够描述人的信息: 创建表达人的信息的结构体类型,在Contact.h中定义: 而

  • C语言实现通讯录程序

    本文实例为大家分享了C语言实现通讯录程序的具体代码,供大家参考,具体内容如下 设计要求: 可以存放1000个人的信息,每个人的信息包括姓名.年龄.性别.电话.住址 通讯录功能包括: 1.增加联系人 2.删除指定联系人 3.查找指定联系人 4.修改指定联系人 5.显示所有联系人 6.退出通讯录 思路分析: 首先我们需要创建3个文件,分别是源文件(test.c).通讯录文件(contact.c).通讯录头文件(contact.h),其中头文件用来包含头文件.声名信息.结构体.创建全局变量以及宏. 我

  • C语言编程动态内存开辟实现升级版通讯录教程示例

    目录 前言 一.存放联系人信息 二.通讯录初始化 三.增加联系人 四.销毁通讯录 后记 前言 所谓动态内存开辟的通讯录,就是我需要多少联系人,就给多少联系人,防止给定一个联系人上限,需要增加联系人无法扩容,而联系人没有上限那么多又会造成内存浪费. 本文继之前的静态通讯录作出改进,有兴趣的同学可以看看之前的文章:C语言实现静态通讯录 一.存放联系人信息 这里是用struct PeoInfodata结构体指针指向通讯录,而不再直接 struct PeoInfo data[Max] 用结构体数组定义通

  • C语言之通讯录的模拟实现代码

    在C语言学习结束之际,谨以此篇文章来对C语言的学习告一段落. 纲要: 通讯录的静态版本 通讯录的动态版本 通讯录的带文件版本 因为三种实现方法除了储存形式不同,其他都基本相同,所以我们重点论述静态版本的实现,以及它们不同的储存方式. 一.通讯录的静态版本 为什么叫它为静态版本呢,因为在此部分的储存是以数组来储存的,那对于各种各样的信息,我们要拿什么数组来存放它呢?当然是结构体数组了,所以我们来定义一个结构体来表示个人信息: //采用宏的目的是方便日后修改 #define NAME_MAX 20

  • C语言实现简单通讯录功能

    本文实例为大家分享了C语言实现简单通讯录功能的具体代码,供大家参考,具体内容如下 1.存放联系人信息 2.信息:名字+年龄+性别+电话+住址 3.增加联系人 4.删除联系人 5.查找联系人 6.修改联系人 7.排序 test.c源文件代码如下: #define _CRT_SECURE_NO_WARNINGS 1 #include "contact.h" void menu() { printf("#####################################\n&

  • C语言静态与动态通讯录的实现流程详解

    目录 静态通讯录 contact.h contact.c test.c 动态通讯录 contact.h contact.c qsort.c test.c 本次通讯录的代码已经放到我的Gitee仓库中,感兴趣的小伙伴可以去看看 Gitee 静态通讯录 在我们学习完C语言的结构体.指针以及动态内存管理之后,我们就可以实现一些有意思的小项目了,通过这些小项目可以加深我们对于相关知识的理解. 静态通讯录主要要求有 静态大小,可以记录10个人的信息(大小自己定) 记录的信息如下:名字.性别.年龄.电话.住

  • C语言 风靡一时的黄金矿工游戏实现流程详解

    游戏的玩法主要是通过不断采集地下的黄金和钻石,来得到更高的积分.只有完成任务目标,才可以通过相应的关卡.游戏画面中沙滩上的人物便是玩家的角色,下方深褐色的部分是地下,而黄金和钻石就是玩家需要采集的物品.人物右边的四个方框里的物品是游戏中可以使用的道具. 画面中的虚线就是游戏中的探测器,探测器会不断的左右摆动,当摆动到地下的黄金和钻石的位置时,只需要点击矿坑任意处,便可以发射勘探头采集到这些物品,当然一定要瞄准好再出手呦. 当然想要顺利采集到丰富的资源也不是那么简单的,地下矿坑中,会有各式各样的困

  • C++简易通讯录系统实现流程详解

    目录 实现功能 定义通讯录和通讯录人员结构体 实现通讯录输入菜单 1.定义菜单函数: 2.主函数循环体中循环展示菜单信息 实现增删改查和清空通讯录功能 运行截图展示 实现功能 提示:这里可以添加本文要记录的大概内容: 通过c++语法的学习,实现一个简易的通讯录功能,具体实现功能如下: 添加联系人:向通讯录中添加联系人,信息包括(姓名.性别.年龄.联系电话.家庭住址),做多记录1000人 显示联系人:显示通讯录中所有联系人信息 删除联系人:按照姓名进行删除联系人 查找联系人:按照姓名进行查找联系人

  • C语言与C++动态通讯录超详细实现流程

    目录 1.思路以及要实现的功能 2.详细步骤 2.1 打印菜单界面(建一个源文件test.c) 2.2 主函数 2.3 初始化函数与加载函数 2.4 增加联系人函数AddContact 2.5 删除联系人函数DelContact 2.6 查找联系人函数与打印函数 2.7 修改信息函数ModifyContact 2.8 排序函数SortContact 2.9 保存信息函数与销毁数据函数 3.源码 1.思路以及要实现的功能 通讯录就是为了存储许多联系人的不同方面的信息如名字.电话.地址.年龄.性别等

  • Java动态代理和反射机制详解

    反射机制 Java语言提供的一种基础功能,通过反射,我们可以操作这个类或对象,比如获取这个类中的方法.属性和构造方法等. 动态代理:分为JDK动态代理.cglib动态代理(spring中的动态代理). 静态代理 预先(编译期间)确定了代理者与被代理者之间的关系,也就是说,若代理类在程序运行前就已经存在了,这种情况就叫静态代理 动态代理 代理类在程序运行时创建的代理方式.也就是说,代理类并不是在Java代码中定义的,而是在运行期间根据我们在Java代码中的"指示"动态生成的. 动态代理比

  • C语言 数据结构之数组模拟实现顺序表流程详解

    目录 线性表和顺序表 线性表 顺序表 静态顺序表 动态顺序表 代码已经放在Gitee上,需要可以小伙伴可以去看看 用C语言数组模拟实现顺序表 Gitee 线性表和顺序表 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列,这是我们广泛使用的数据结构. 线性表在逻辑上是线性结构,也就说是连续的一条直线.但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储. 常见的线性表:顺序表.链表.栈.队列.字符串- 顺序表 顺序表是用一段物理地址连

  • C语言实现顺序表的基本操作的示例详解

    目录 一.认识顺序表 1.线性表 2.顺序表的概念及结构 二.顺序表的基本操作(接口实现) 1.初始化顺序表 2.打印顺序表 3.尾插 4.尾删 5.扩容 6.头插 7.头删 8.任意位置插入 9.任意位置删除 10.查找某个数的位置 三.顺序表演示及代码(含源码) 1.演示效果 2.完整源代码 一.认识顺序表 1.线性表 线性表是n个具有相同特性的数据元素的有限序列,线性表是一种在实际中广泛使用的数据结构,常见的线性表有顺序表.链表.栈.队列.字符串……线性表在逻辑上是线性结构,也就是说是一条

  • Java语言面向对象编程思想之类与对象实例详解

    在初学者学Java的时候,面向对象很难让人搞懂,那么今天小编就来为大家把这个思想来为大家用极为简单的方法理解吧. 首先我们来简单的阐述面向对象的思想. 面向对象: 官方的语言很抽象,我们把官方的解释和定义抛开.想想,自己有什么,对!!我们自己有手脚眼口鼻等一系列的器官.来把自己所具有的器官就可以看作我们的属性,自己是不是可以喜怒哀乐和嬉笑怒骂,这些是不是我们的行为,那么自己的具有的属性加自己有的行为就称为一个对象. 注意!!我们自己,一个个体是一个对象,因为,你是你,我是我,我们虽然有相同的,但

  • C语言中函数参数的入栈顺序详解及实例

    C语言中函数参数的入栈顺序详解及实例 对技术执着的人,比如说我,往往对一些问题,不仅想做到"知其然",还想做到"知其所以然".C语言可谓博大精深,即使我已经有多年的开发经验,可还是有许多问题不知其所以然.某天某地某人问我,C语言中函数参数的入栈顺序如何?从右至左,我随口回答.为什么是从右至左呢?我终究没有给出合理的解释.于是,只好做了个作业,于是有了这篇小博文. #include void foo(int x, int y, int z) { printf(&quo

随机推荐