⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_slinklist.cpp

📁 vc++的单链表通讯录设计
💻 CPP
字号:
#include"c1.h"
 
typedef int ElemType;
// c2-2.h 线性表的单链表存储结构
 struct LNode
 {
   ElemType data;
   LNode *next;
 };
 typedef LNode *LinkList; // 另一种定义LinkList的方法

 char pause;
 void handle_choice(int choice);//菜单选择
 LinkList L;
 
 //bo2-2.cpp
Status comp(ElemType c1,ElemType c2)
 { // 数据元素判定函数(相等为TRUE,否则为FALSE)
   if(c1==c2)
     return TRUE;
   else
     return FALSE;
 }

 void visit(ElemType c) // 访问操定为:输出元素值
 {
   cout<<c<<ends;
 }
 
 
 
 void CreateList(LinkList &L,int n) // 算法2.11
 { // 逆位序(插在表头)输入n个元素的值,建立带表头结构的单链线性表L
   int i;
   LinkList p;
   system("cls");//清屏
   L=new(LNode);
   L->next=NULL; // 先建立一个带头结点的单链表
   cout<<"请输入"<<n<<"数据元素"<<endl;//将创建的链表中数据元素的个数
   for(i=n;i>0;--i)
   {
     p=new(LNode); // 生成新结点
     cin>>p->data; // 输入元素值
     p->next=L->next; // 插入到表头
     L->next=p;
   }
 }

int ListLength(LinkList L)
 { // 初始条件:线性表L已存在。操作结果:返回L中数据元素个数
   int i=0;
   system("cls");
   LinkList p=L->next; // p指向第一个结点
   while(p) // 没到表尾
   {
     i++;
     p=p->next;
   }
  return i;
 }

Status GetElem(LinkList L,int i,ElemType &e) // 算法2.8
 { // L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
   int j=1; // j为计数器
   
   LinkList p=L->next; // p指向第一个结点
  system("cls"); 
  while(p&&j<i) // 顺指针向后查找,直到p指向第i个元素或p为空
   {
     p=p->next;
     j++;
   }
   if(!p||j>i) // 第i个元素不存在
     return ERROR;
   e=p->data; // 取第i个元素
   return OK;
 }

 int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
 { // 初始条件: 线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
   // 操作结果: 返回L中第1个与e满足关系compare()的数据元素的位序。
   //           若这样的数据元素不存在,则返回值为0
   int i=0;
   LinkList p=L->next;
   system("cls");
   while(p)
   {
     i++;
     if(compare(p->data,e)) // 找到这样的数据元素
       return i;
     p=p->next;
   }
   return 0;
 }

Status ListInsert(LinkList &L,int i,ElemType e) // 算法2.9。
 { // 在带头结点的单链线性表L中第i个位置之前插入元素e
   int j=0;
   LinkList p=L,s;
   system("cls");
   while(p&&j<i-1) // 寻找第i-1个结点
   {
     p=p->next;
     j++;
   }
   if(!p||j>i-1) // i小于1或者大于表长
     return ERROR;
   s=new(LNode); // 生成新结点
   s->data=e; // 插入L中
   s->next=p->next;
   p->next=s;
   return OK;
 }

 Status ListDelete(LinkList &L,int i,ElemType &e) // 算法2.10。
 { // 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
   int j=0;
   LinkList p=L,q;
   system("cls");
   while(p->next&&j<i-1) // 寻找第i个结点,并令p指向其前趋
   {
     p=p->next;
     j++;
   }
   if(!p->next||j>i-1) // 删除位置不合理
     return ERROR;
   q=p->next; // 删除并释放结点
   p->next=q->next;
   e=q->data;
   delete(q);
   return OK;
 }

Status ListTraverse(LinkList L,void(*vi)(ElemType))
 // vi的形参类型为ElemType,与bo2-1.cpp中相应函数的形参类型ElemType&不同
 { // 初始条件:线性表L已存在
   // 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败
   LinkList p=L->next;
   system("cls");
   while(p)
   {
     vi(p->data);
     p=p->next;
   }
   cout<<endl;
   //cin.get(pause);
   //system("pause");
   return OK;
 }

Status DestroyList(LinkList &L)
 { // 初始条件:线性表L已存在。操作结果:销毁线性表L
   LinkList q;
   while(L)
   {
     q=L->next;
     delete(L);
     L=q;
   }
   return OK;
 }

//主函数
int main()
{
	
	system("cls");//执行系统命令cls,清屏
	int choice;
    //cin.get(pause);
	do
	{//显示主菜单
		//system("cls");
		cout<<"1-创建单链表\n";
		cout<<"2-在单链表第i个位置插入元素\n";
		cout<<"3-删除单链表中第i个位置的元素\n";
		cout<<"4-返回第i个元素的值\n";
		cout<<"5-查找元素\n";
        cout<<"6-显示单链表\n";
		cout<<"7-测试表长\n";
		cout<<"8-退出\n";
		cout<<"Enter choice:";
		cin>>choice;
		
		handle_choice(choice);//Call function to direct flow based on choice
		}while(choice!=8);//Repeat menu until user chooses to exit
	return 0;
}//end of main function

void handle_choice(int choice) //根据用户选择调用对应处理函数
{  int i,e;
   switch(choice)
	{
	case 1://If choice was to add a record to the database 
		cout<<"请输入要创建的单链表中结点个数:";
		cin>>i;//将创建的链表中数据元素的个数
		cout<<endl;
		CreateList(L,i);
		break;
	case 2://If choice was to display all records in the database
		cout<<"请输入插入位置:";
		cin>>i;//将创建的链表中数据元素的个数
		cout<<endl;
		cout<<"请输入插入元素的值:";
		cin>>e;//将创建的链表中数据元素的个数
		cout<<endl;
		ListInsert(L,i,e);
		break;
	case 3://If choice was to 
		cout<<"请输入删除位置:";
		cin>>i;//将创建的链表中数据元素的个数
		cout<<endl;
		ListDelete(L,i,e);
		cout<<"被删除元素为:"<<e<<endl;
		cin.get(pause);
        system("pause");
		break;
	case 4://If choice was to 
		cout<<"请输入要查询的元素位置:";
		cin>>i;
        GetElem(L,i,e);
		cout<<"第"<<i<<"个元素值为:"<<e<<endl;
		cin.get(pause);
        system("pause");
		break;
	case 5://If choice was to 
		cout<<"请输入要查询的元素值:";
		cin>>e;//
        i=LocateElem(L,e,comp);
		cout<<"查询元素"<<e<<"位于链表的位置为:"<<i<<endl;
		cin.get(pause);
        system("pause");
		break;
	case 6://
		ListTraverse(L,visit);
		cout<<endl;
		cin.get(pause);
        system("pause");
		break;
	case 7://If choice was to 
		i=ListLength(L);
		cout<<"该链表长为:"<<i<<endl;
		cin.get(pause);
        system("pause");
		break;
	case 8:
		DestroyList(L);
		break;
	default://If any other(invalid) choice was entered,display error message
		cout<<"Invalid choice\n";
		break;
	}
}//end of function handle_choice









⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -