您的位置:首页 > 理论基础 > 数据结构算法

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

2012-08-31 09:06 405 查看
/*题目要求:
设计以设计菜单项的处理功能为基础,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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: