C语言数据结构——用链表实现一个简单的电话号码簿

用链表实现一个简单的电话号码簿

整体上用链表来实现简易的电话号码簿,所用数据的存储结构是链式存储结构,逻辑结构是线性结构。

**基本思路:**首先创建一个单链表,输入数据组数,之后输入相应组数的姓名与电话号码;再按照需求选择进行插入、删除数据以及电话号码簿的打印。

主函数里面调用创建链表函数(create_peo(LinkList &L,int n)),插入函数(insert_peo(LinkList &L,int i,LinkList &s))、删除函数(delete_peo(LinkList &L,int i,LinkList &e))、打印函数(print_peo(LinkList &L))。

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

typedef char DataType;
typedef struct Node{ //线性表的单链表存储结构 
    struct {
        char name[20];
        char number[12];
    }data; //定义结构变量 
    char name[20];
    char number[12];
    struct  Node *next;
}LNode,*LinkList;

void create_peo(LinkList &L,int n);  //创建单链表 
int insert_peo(LinkList &L,int i,LinkList &s);  //插入个人信息 
int delete_peo(LinkList &L,int i,LinkList &e);  //删除个人信息 
void print_peo(LinkList &L);   //打印 
void exit_system();  //退出程序

int main()
{
	int choice;
	int n,i,j;
	LinkList p=NULL;
	LinkList L,s,e;
	while(1)
	{
		printf("这是一个电话号码管理系统\n");
        printf("1.创建链表\n");
        printf("2.插入个人信息\n");
        printf("3.删除个人信息\n");
        printf("4.显示当前链表\n");
        printf("0.退出\n");
        printf("********************\n");
        printf("请输入功能序号\n");
	    scanf("%d",&choice);
	    switch(choice) 
	    {
		case 1:
			printf("输入你想创建的数据组数:");
			scanf("%d",&n); 
		    create_peo(L,n);
		    break;
		case 2:
			printf("请输入需要插入的位置:");
            scanf("%d",&i); 
		    insert_peo(L,i,s); 
		    break;
		case 3:
    		printf("输入你想删除的位置:"); 
    		scanf("%d",&i);
			delete_peo(L,i,e); 
			break;
		case 4:
			print_peo(L);
			break;
		case 0:
			exit_system();
			break;	
		default:printf("输入有误,请重新输入:");
		    break;	
	    }
    }
	return 0;
} 

void create_peo(LinkList &L,int n)
{
	//逆位序输入 n个元素的值,建立带表头结点的单链线性表L 
	LinkList p;
	int i;
	L=(LinkList)malloc(sizeof(LNode));
	L->next=NULL;  //先建立一个带头结点的单链表 
	for(i=n;i>0;--i)
	{
		p=(LinkList)malloc(sizeof(LNode));  //生成新结点 
		printf("请输入联系人姓名:");
		scanf("%s",p->data.name);
		printf("请输入联系人电话号码:");
		scanf("%s",p->data.number);  //输入元素值 
		p->next=L->next;
		L->next=p;  //插入到表头 
	}
} //create_L 

int insert_peo(LinkList &L,int i,LinkList &s)
{  //在带头结点的单链线性表 L中第i个位置之前插入元素 e 
	LinkList p=L;
    int j=0;
    while(p&&j<i-1)
    {
    	p=p->next;
    	++j;
	} //寻找第 i-1个结点 
    if(!p||j>i-1)
	{
        printf("插入位置不合法!");
        exit (1);
    }
    else
	{
        s=(LinkList)malloc(sizeof(LNode));  //生成新结点 
        printf("请输入需要插入的联系人姓名:");
        scanf("%s",s->data.name);
        printf("请输入需要插入的联系人电话:");
        scanf("%s",s->data.number);
        s->next=p->next;  //插入 L中 
        p->next=s;
        printf("您已添加成功!\n");
    }
    return 1;
}

int delete_peo(LinkList &L,int i,LinkList &e){//删除第i个结点
    LinkList p=L,q;
    int j=0;
    while(p->next&&j<i-1)
    {  //寻找第i个结点,并令p指向其前驱 
    	p=p->next;
    	++j;
	}
	if(!(p->next)||j>i-1)
	{
		printf("删除位置不合法");
		exit(1); 
	}
	else
	{
		q=p->next;
	    p->next=q->next;
	    e=q;
	    free(q);
	    printf("您已删除成功!\n");
	}	

}

void exit_system()
{
    printf("退出中.....\n");
    system("pause");
    exit(0);
}

void print_peo(LinkList &L)
{//打印
    LinkList p;
    p=L;
    printf("姓名\t\t电话\n\n");
    while(p->next!=NULL){
        p=p->next;
        printf("%s\t%s\n",p->data.name,p->data.number);
    }
}

①:选择1:创建一个链表,创建三组数据,分别输入这三组数据;再选择4:显示当前链表;
在这里插入图片描述
②:选择2:在指定位置插入一组数据,输入数据信息;再选择4:显示当前链表;
在这里插入图片描述
③:选择3:在指定位置进行删除操作;再选择4:显示当前链表。
在这里插入图片描述
------------------------------------------------END-------------------------------------------

  • 20
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值