数据结构实训三简单的链表

/*题目要求:
设计以设计菜单项的处理功能为基础,5个不同功能的算法实现编程题目,目的是熟悉利用链表结构来解决实际应用问题的能力,进一步理解和熟悉线性表的链式存储结构。
为了实现数据管理的几种操作功能,首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单配上相应的功能。
	题目内容:
主控菜单设计要求:
1.主控菜单设计要求:程序运行后,给出6个菜单项的内容和输入提示:
   		1.链表的建立 
  		2.链表结点的插入  
		3.链表结点的查询  
		4.链表结点的删除  
   		5.链表的输出  
  		0.退出管理系统  
        请 选 择0-5:
2.设计要求
使用数字0-5来选择菜单项,其他输入则不起作用。
3.设计过程中,按照各个菜单的功能要求,编写相应的函数。
参考源程序:z*/
/*-----------------------------------
      主控菜单处理测试程序
------------------------------------*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int DataType;
typedef struct node
{
	DataType data;
	struct node *next;
}ListNode;
typedef ListNode *LinkList;
LinkList head;
ListNode *p;
int menu_select();/*菜单选择函数程序*/
LinkList CreateList();/*用尾插入法建立通讯录链表函数*/
void InsertNode(LinkList head,ListNode *p);/*在通讯录链表head中插入结点*/
ListNode *ListFind(LinkList head);/*有序通讯录链表上的查找*/
void DelNode(LinkList head);/*通讯录链表上结点的删除*/
void PrintList(LinkList head);/*通讯录链表的输出函数*/
void main()
{
	for(;;)
	{
		switch(menu_select())
		{
		case 1:
			printf("*****************************************\n");
			printf("*     链  表  的  建   立   *\n");
			printf("******************************************\n");
			head=CreateList();
			break;
		case 2:
			printf("*****************************************\n");
			printf("*    链  表  信  息  的  添  加   *\n");
			printf("******************************************\n");
		
			p=(ListNode*)malloc(sizeof(ListNode));
			scanf("%d",	&p->data);
			InsertNode(head,p);
			break;
		case 3:
			printf("*****************************************\n");
			printf("*   链  表   信  息  的 查 询*\n");
			printf("******************************************\n");
			p=ListFind(head);
			if(p!=NULL)
			{
				
				printf("================================\n");
				printf("%d \n",p->data);
				printf("====================================\n");
			}
			else
				printf("没查到要查询的数据!\n");
			break;
		case 4:
			printf("*****************************************\n");
			printf("*    链   表  信  息  的 删    除   *\n");
			printf("******************************************\n");
			DelNode(head);
			break;
		case 5:
			printf("*****************************************\n");
			printf("*       链   表  的  输   出   *\n");
			printf("******************************************\n");
			PrintList(head);
			break;
		case 0:
			printf("\t 再  见!\n");
			return;
		}
	}
}
/*******************************
	菜单选择函数程序
*******************************/
int menu_select()
{
	int sn;
	printf("\n     数据管理系统\n");
	printf("=================================\n");
	printf("   1.链表的建立  \n");
	printf("   2.结点的插入  \n");
	printf("   3.结点的查询  \n");
	printf("   4.结点的删除  \n");
	printf("   5.链表的输出  \n");
	printf("   0.退出管理系统  \n");
	printf("===================================\n");
	printf("    请   选   择 0-5    \n");
	for(;;)
	{
		scanf("%d",&sn);
		if(sn<0||sn>5)
			printf("\n\t输入错误,重选0-5:");
		else
			break;
	}
	return sn;
}
/*******************************
	用尾插入法建立通讯录链表函数
*******************************/
LinkList CreateList()
{
	LinkList head=(ListNode*)malloc(sizeof(ListNode));
	ListNode *p,*rear;
	int flag=0;
	rear=head;
	while(flag==0)
	{
		p=(ListNode *)malloc(sizeof(ListNode));
		printf("请输入要插入的数据\n");
	
		scanf("%d",&p->data);
		rear->next=p;
		rear=p;
		printf("结束建表吗?(1/0):1.结束 0.否");
		scanf("%d",&flag);
	}
	rear->next=NULL;
	return head;
}
/*******************************
	在链表head中插入结点
*******************************/
void InsertNode(LinkList head,ListNode *p)
{
	ListNode *p1,*p2;
	p1=head;
	p2=p1->next;
	while(p2!=NULL && p2->data<p->data)
	{
		p1=p2;
		p2=p2->next;
	}
	p1->next=p;
	p->next=p2;
}
/*******************************
	有序链表上的查找
*******************************/
ListNode *ListFind(LinkList head)
{
	ListNode *p;
	DataType num;
	
	
	p=head->next;
	
	
		printf("请输入要查找的数据\n");
		scanf("%d",&num);
		while(p && p->data!=num)
			p=p->next;
		if(p==NULL||p->data>num)
			p=NULL;
	 
		return p;
}
/*******************************
   链表上结点的删除
*******************************/
void DelNode(LinkList head)
{
	char jx[3];
	ListNode *p,*q;
	p=ListFind(head);
	if(p==NULL)
	{
		printf("没有查到要删除的数据!\n");
		return ;
	}
	printf("真的要删除该结点吗?(y/n): ");
	scanf("%s",jx);
	if(strcmp(jx,"Y")==0||strcmp(jx,"y")==0)
	{
		q=head;
		while(q!=NULL&&q->next!=p)
			q=q->next;
		q->next=p->next;
		free(p);
		printf("数据已被删除!\n");
	}
}
/*******************************
   链表的输出函数
*******************************/
void PrintList(LinkList head)
{
	ListNode *p;
	p=head->next;

	printf("----------------------------------\n");
	while(p!=NULL)
	{
		printf("%d\n",	p->data);	
		printf("=========================================\n");
		p=p->next;
}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值