线性表的输入、输出、删除和修改之个人通讯录管理系统

2023-05-16

线性表的基本操作:

小牛试刀:

        顺序表中基本的输入、输出之查找第i个数据元素的值:

代码:

#include <stdio.h> 
#define LISTSIZE 100
typedef int DateType; 
typedef struct {
	DateType data[LISTSIZE];
	int length;
}SqlList;

void input(SqlList &L, int n)
{
	printf("请输入元素:\n");
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &L.data[i-1]);
    }
    L.length=n;
    printf("\n");
}
void output(SqlList &L, int n)
{
    for (int i = 1; i <= n; i++)
    {
        printf("%-3d", L.data[i-1]);
    }
    printf("\n");
}
void GetData(SqlList L, int i, int &a)
{
    a = L.data[i - 1];
}
int main()
{
    int a,num;
    SqlList L;
    printf("请输入插入的元素:\n");
    input(L, 5);
    printf("输出的元素是:\n");
    output(L, 5);
    printf("\n请输入需要查找的元素位置:");
    scanf("%d",&num);
    GetData(L, num, a);
    printf("\n第 %d 个位置元素的值是:%d", num, a);
    return 0;
}

效果图:

基础篇:

        完成顺序表的基本操作(如输入、输出、插入操作、删除操作、查找操作等)

代码:

#include <stdio.h> 
#define ListSize 100
typedef int DateType; // 把int类型定义成新的类型
typedef struct {
	DateType data[ListSize];
	int length;
}SeqList;

//输入函数
void input(SeqList &L) {
	printf("请输入数据后按回车键确认,若想结束输入请按“#”\n");
	printf("***********************************\n");
	char num[20];

	int sum = 0,i,b,j=0;
	printf("请输入元素: ");
	gets(num);
	if(num[0] == '#') break;
	L.length++;
	}
}

//删除元素
void deleteData(SeqList &L){
    printf("\n请输入删除元素的位置:");
    int position;
    scanf("%d",&position);
    if(position<1 || position>L.length){
        printf("删除位置不合法!\n");
        return;
    }
    int number;
    number=L.data[position-1];
    for(int i=position;i<L.length;i++){
        //空间变小,元素需要往前移位
        L.data[i-1]=L.data[i];
    }
    L.length--;
    printf("要删除的元素是%d\n",number);

}

//查找(获取)元素
void GetData(SeqList L){
    int number;
    printf("\n");
    printf("请输入要查找的元素:");
    scanf("%d",&number);
    for(int i=0;i<=L.length;i++){
        if(L.data[i]==number){
            printf("查找成功!值为%d,位于当前顺序表的第 %d 个位置\n",number,i+1);
            break;
        }
    }
}

//插入元素
void insertList(SeqList &L){
    printf("\n请输入插入位置的元素:");
    int index;
    scanf("%d",&index);
    if(index<1 || index>L.length+1){
        printf("插入位置不合法!");
        return;
    }
    if(L.length>=ListSize){
        printf("线性表已满,无法插入元素!");
        return;
    }
    int num;
    printf("\n请输入插入的元素:");
    scanf("%d",&num);
    //从最后一个元素往后移
    for(int k=L.length-1;k>=index-1;k--){
        L.data[k+1]=L.data[k];
    }
    //插入元素num
    L.data[index-1]=num;
    L.length++;
}

// 输出函数
void output(SeqList L){
	printf("\n");
	printf("****遍历顺序表中的元素***\n");
	for(int i = 1; i<= L.length; i++) {
		printf("第%d个元素的值为 %d\n",i,L.data[i-1]);
	}
}

int main(){
    SeqList L;
    L.length=0;
    input(L);
    output(L);
    GetData(L);
    insertList(L);
    printf("\n插入后的线性表是:");
    output(L);
    deleteData(L);
    printf("\n删除后的线性表是:");
    output(L);
    return 0;
}

效果图:

加强篇:

        已知线性表La和Lb的元素按值非递减排列,归并La和Lb得到新的线性表Lc,Lc的元素也按值非递减排列。(注:需要使用顺序表和链表分别完成)

代码:

#include <stdio.h>
#define ListSize 100
typedef int DataType;
typedef struct{
    DataType data[ListSize];
    int length;
}SeqList;

typedef struct Node{
    DataType data;
    struct Node *next;
}Node,*LinkList;

//顺序表输入
void input_Seqlist(SeqList &L){
    printf("请输入数据总量:");
    int num;
    scanf("%d",&num);
    printf("请输入数据:");
    int number;
    for(int i=1;i<=num;i++){
        scanf("%d",&number);
        L.data[i-1]=number;
        L.length++;
    }
}

//顺序表输出
void output_Seqlist(SeqList L){
    printf("\n线性表中数据是:\n"); 
    for(int i=1;i<=L.length;i++){
        printf("%d)>、%d\t\t",i,L.data[i-1]);
    }
    printf("\n");
}

//顺序表的合并
void mergeList1(SeqList La,SeqList Lb,SeqList &Lc){
    int i=0,j=0,k=0;
    while(i<=La.length-1 && j<=Lb.length-1){
        if(La.data[i]<=Lb.data[j]){
            Lc.data[k]=La.data[i];
            i++;
            k++;
        }else{
            Lc.data[k]=Lb.data[j];
            j++;
            k++;
        }
    }
    while(i<=La.length-1){
        Lc.data[k]=La.data[i];
        i++;k++;
    }
    while(j<=Lb.length-1){
        Lc.data[k]=La.data[j];
        j++;k++;
    }
    Lc.length=La.length+Lb.length;
}

//使用链表输入
void input_Link(LinkList &L){
    int nums,i=1;
    printf("请输入数据总量:");
    int num;
    scanf("%d",&num);
    L=new Node;
    Node *s,*r=L;
    printf("请输入数据元素:");
    while(i<=num){
        scanf("%d",&nums);
        s=new Node;
        s->data=nums;
        r->next=s;
        r=s;
        i++;
    }
    r->next=NULL;
}

//使用链表输出
void ouput_Link(LinkList L){
    int i=1;
    Node *p;
    p=L->next;
    while(p!=NULL){
        printf("%d)--->%d\t\t",i,p->data);
        p=p->next;
        i++;
    }
    printf("\n");
}

//使用链表合并
void mergeList2(LinkList LA,LinkList LB,LinkList &LC){
    Node *pa,*pb,*pc;
    pa=LA->next;
    pb=LB->next;
    LC=LA;
    pc=LC;
    while(pa!=NULL && pb!=NULL){
        if(pa->data<=pb->data){
            pc->next=pa;
            pc=pa;
            pa=pa->next;
        }else{
            pc->next=pb;
            pc=pb;
            pb=pb->next;
        }
    }
    if(pa){
        pc->next=pa;
    }else{
        pc->next=pb;
    }
    delete LB;
}

//主函数
int main(){
    //初始化
    SeqList La,Lb,Lc;
    La.length=0;
    Lb.length=0;
    Lc.length=0;
    LinkList LA,LB,LC;
    LA=NULL;
    LB=NULL;
    LC=NULL;
    printf("1、使用链表合并\n2、使用顺序表合并\n3、退出程序\n");
    int number;
    scanf("%d",&number);

    if(number==1){
        //1、链表合并
        printf("\n请输入第一个升序排列的链表ListA\n");
		input_Link(LA);
		ouput_Link(LA);
		printf("\n请输入第二个升序排列的链表ListB\n");
		input_Link(LB);
		ouput_Link(LB);
		mergeList2(LA,LB,LC);
		printf("\n使用链表合并成功!\n");
		ouput_Link(LC);
    }else if(number==2){
        //2、顺序表合并
        printf("\n请输入第一个升序排列的线性表ListA\n");
        input_Seqlist(La);
        output_Seqlist(La);
        printf("\n请输入第二个升序排列的线性表ListB\n");
        input_Seqlist(Lb);
        output_Seqlist(Lb);
        mergeList1(La,Lb,Lc);
        printf("\n使用线性表合并成功!\n");
        output_Seqlist(Lc);
        printf("SeqListC线性表的长度是:%d",Lc.length);
    }else{
        printf("退出程序!!!\n");
    }
    return 0;
}

效果图:

提高篇:

        为方便管理个人通讯录系统,编写一个简单的通讯录管理系统,系统记录必须有姓名、电话号码、QQ号。

需要完成的功能如下:

  1. 输入信息:调用此函数用以输入数据到内存中,此过程包括建立相应的链表或相应的数组,便于读取
  2. 显示信息:用以显示输入的数据
  3. 查找:以姓名作为关键字查找要找的信息
  4. 删除信息:用以删除选定的输入信息(姓名作为关键字)
  5. 修改信息:用以修改选定的输入信息(姓名作为关键字)
  6. 打开通讯录:存储从文件中读取的字符
  7. 添加信息:用尾插法以添加信息
  8. 保存:调用此函数将内存中的数据保存至磁盘中
  9. 清屏:执行cls命令

 改进中......

代码:

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

typedef struct Student{
	char name[20];			//姓名
	char telephone[20];		//电话号码
	int qq[20];				//QQ号
	struct Student *next; 
}Node; 

Node *head;//头指针 

//初始化系统界面 
void screnn(){
	printf("==========欢迎来到个人通讯录管理系统!==========\n");
	printf("            1.输入信息         2.显示信息\n");
    printf("            3.查找信息         4.删除信息\n");
    printf("            5.修改信息         6.添加信息\n");
    printf("            7.保存通讯录       8.显示系统界面\n");
    printf("            		9.清屏cls\n");
    printf("\n===============输入0退出程序===============\n");
}

// 1 输入信息
void enter()
{
    int ans; // 判断是否继续输入
    Node *p1, *p2;
    p1 =new Node; // 申请内存来用
    if (p1 != NULL)
    {
        printf("========输入数据========\n");
        head = p1;
        while (1)
        {
            printf("姓名:");
            scanf("%s", &p1->name);
            printf("电话号码:");
            scanf("%s", &p1->telephone);
            printf("QQ号码:");
            scanf("%s", &p1->qq);
            printf("\n\n");
            p2 = p1;
            // 申请下一个要用的空间
            p1 = new Node; 
            if (p1 != NULL)
                p2->next = p1;
            //用户选择
            printf("请选择是否继续输入:1.继续  2.退出\n请选择:"); 
            scanf("%d", &ans);
            if (ans == 1) 
                continue;
            else
            { 	//退出
                printf("\n========输入完成========\n\n");
                p2->next = NULL;
                //将申请的的无用内存释放
                delete(p1); 
                break;
            }
        }
    }
}

主函数:

	
int main(){
	//显示通讯录系统界面 
	screnn();  
    
    int numbers;
    while(1){
    	printf("请输入你的选择(1~9):");
    	scanf("%d",&numbers); 
    	printf("\n");
    	if(numbers<0 || numbers>9){
    		printf("输入有误!");
    		continue; 
		}
		switch(numbers){
			case 0:
				printf("\n==========欢迎你再次使用个人通讯录管理系统!==========\n");
				//退出系统 
				exit(1);
				break; 
					
			case 1:
				//1输入信息
				enter();
				break;
				
			case 2:
				//2显示信息
				display(head);
				break;
				
			case 3:
				//3查找信息
				search(head);
				break;
				
			case 4:
				//4删除信息
				deleted();
				break;
				
			case 5:
				//5修改信息
				update(head);
				break;
				
			case 6:
				//6添加信息
				insert();
				break;
				
			case 7:
				//7保存通讯录
				save(head);
				break;
			
			case 8: 
				//显示通讯录系统界面 
				screnn();
				break;
				
			case 9:
				//8清屏 
				cls();
				break;
				
			default:
				printf("输入有误!请重新输入!");
				break; 
		}
	}	
	return 0;
}

 效果图:

 

有问题可以随时联系小编!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线性表的输入、输出、删除和修改之个人通讯录管理系统 的相关文章

  • 深入理解任务堆栈以及堆栈溢出

    前言 xff1a 在多任务操作系统中创建任务时 xff0c 都需要指定该任务的堆栈大小 xff0c 那么这个堆栈的作用时什么呢 xff1f 什么情况下需要用到堆栈 xff0c 以及大小不够时会产生什么异常呢 xff1f 1 任务状态 简单分
  • 计算机网络的166个概念你知道几个 第四部分

    HTML xff1a HTML 称为超文本标记语言 xff0c 是一种标识性的语言 它包括一系列标签 xff0e 通过这些标签可以将网络上的文档格式统一 xff0c 使分散的 Internet 资源连接为一个逻辑整体 HTML 文本是由 H
  • 15000 字的 SQL 语句大全 第一部分

    一 基础 1 说明 xff1a 创建数据库CREATE DATABASE database name 2 说明 xff1a 删除数据库drop database dbname 3 说明 xff1a 备份sql server 创建 备份数据的
  • 毕业设计源码基于springboot的旧物置换系统的实现

    摘 要 随着时代在一步一步在进步 xff0c 旧物也成人们的烦恼 xff0c 许多平台网站都在推广自已的产品像天猫 咸鱼 京东 所以开发出一套关于旧物置换网站成为必需 旧物置换网站主要是借助计算机 xff0c 通过对用户进行管理 为减少管理
  • 毕业设计源码基于Spring Boot的论坛管理系统的实现

    摘要 xff1a 在社会快速发展的影响下 xff0c 论坛管理系统 继续发展 xff0c 使 论坛管理系统 的管理和运营比过去十年更加 信息化 依照这一现实为基础 xff0c 设计一个快捷而又方便的网上 论坛管理系统 是一项十分重要并且有价
  • 毕业设计源码基于Spring Boot的旅游管理系统的实现

    摘 要 社会的发展和科学技术的进步 xff0c 互联网技术越来越受欢迎 网络计算机的 交易 方式逐渐受到广大人民群众的喜爱 xff0c 也逐渐进入了每个 用户 的使用 互联网具有便利性 xff0c 速度快 xff0c 效率高 xff0c 成
  • 轮询、中断和DMA三种方式的原理和联系

    CPU控制外部设备的方式 xff1a 中断 轮询 DMA 轮询中断DMA 由于外部设备的速度差异 xff0c CPU可以使用不同的方式控制外部设备的访问 常见的方式轮询 中断和DMA 轮询 轮询最简单 xff0c CPU通过不断地查询某个外
  • OpenMV识别色块与STM2F4通过串口通信

    花了三天时间学习了一下OpenMV的简单使用 xff0c 在这写个博客记录一下 xff0c 并且上传自己的代码 xff0c 以方便交流学习 第一次发帖 xff0c 不周之处见谅 首先概括一下我实现的功能 xff1a OpenMV识别红色色块
  • c++语言简单提问

    1 定义一个空的类型 xff0c 里面没有任何成员变量和成员函数 对该类型求sizeof xff0c 得到的结果是 1 2 为什么不是0 空类型的实例中不包含任何信息 xff0c 本来求sizeof应该是0 xff0c 但是当我们声名该类型
  • 二 ROS通信机制-话题通信(发布订阅模式)

    二 ROS通信机制 话题通信 发布订阅模式 ROS 中的基本通信机制2 1话题通信 发布订阅模式 2 1 1概念2 1 2作用2 1 3 理论模型2 1 4 话题通信应用时需要关注的地方 xff1a 3 简单实现3 1ROS工作空间建立 x
  • 解决ROS中运行launch文件报错ERROR: cannot launch node of type[xxx/xxx]:xxx的问题

    解决ROS中运行launch文件报错ERROR cannot launch node of type xxx xxx xxx的问题 错误截图 xff1a 原因 xff1a 解决方式 xff1a 当时我出现的错误是 ERROR cannot
  • c++ stl 五种迭代器

    c 43 43 stl 五种迭代器 2010 12 31 14 22 25 分类 xff1a C 43 43 C 举报 字号 订阅 下载LOFTER 我的照片书 迭代器的分类 Iterator Categories I
  • C语言头文件中定义变量问题(转)

    上个星期回学校的时候 xff0c 刚好碰到一个学弟在写程序 xff0c 并且刚好碰到一个总编不过去的问题 xff0c 我看了看 xff0c 正好是个头文件重复包含问题 xff0c 问题描述如下 xff1a 他在程序中建立了一个global
  • Opencv Aruco识别(python)

    效果图 先上效果 代码 直接上代码 xff1a span class token operator span span class token operator span usr span class token operator span
  • Windows下Cmake安装步骤详解(图文)

    文章目录 Cmake介绍Cmake下载及安装 Cmake介绍 CMake是一个跨平台的安装 xff08 编译 xff09 工具 xff0c 可以用简单的语句来描述所有平台的安装 编译过程 xff0c 并且输出对应的makefile或者pro
  • C语言:通过指针模拟实现strcat函数

    模拟实现strcat strcat函数的功能 把src所指向的字符串 xff08 包括 0 xff09 复制到dest所指向的字符串后面 xff08 删除dest原来末尾的 0 xff09 要保证dest足够长 xff0c 以容纳被复制进来
  • C语言中将字符串拆分再进行拼接

    我们有时候需要对于字符串进行操作 xff0c 主要用到strcat和strtok两个函数 xff0c 因此记录下这次的操作方式以便之后查阅 span class token macro property span class token d
  • 并行编程实现矩阵乘法优化

    实现四种矩阵乘法程序 xff0c 并对比运行效率 1 xff09 串行算法 2 xff09 Catch优化 3 xff09 SSE版本 4 xff09 分片策略 span class token macro property span cl
  • c++的函数reserve()和unique()和sort()

    函数reserve span class token comment vector reserve span span class token macro property span class token directive keywor
  • 关于c中代码加 ‘\‘ 进行换行的说明

    我们在c与c 43 43 中经常会遇到一种情况就是加 进行换行来保持代码整体结构一致的使用情况 xff0c 那么具体来说换行的规则是什么 xff0c 这里进行一下记录 span class token macro property span

随机推荐