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

线性表的基本操作:

小牛试刀:

        顺序表中基本的输入、输出之查找第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号。

扫描二维码关注公众号,回复: 15674969 查看本文章

需要完成的功能如下:

  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;
}

 效果图:

 

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

猜你喜欢

转载自blog.csdn.net/qq_42680327/article/details/129635184