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

📄 操作链表.cpp

📁 1、 用链表实现线性表。其中
💻 CPP
📖 第 1 页 / 共 2 页
字号:

 #include "c1.h"
 #include <string>
 //#include"操作链表.cpp" 
 typedef int ElemType;
	int play() ;
	//void play_6() ;
	void say_goodbye();

 struct LNode
 {
   ElemType data;
   LNode *next;
 };
	typedef LNode * LinkList; // 另一种定义LinkList的方法
	LinkList	L; 
	ElemType	e,e0;
	Status		i;
	int			j,k,digit , L_position ;
	char		c , c_digit[10];
	
	//string		str_digit ;
	static int	Init_flag = 0 ;	
	int			print_flag ;

  Status comp(ElemType c1,ElemType c2)
 { // 数据元素判定函数(相等为TRUE,否则为FALSE)
   if(c1==c2)

     return TRUE;
   else
     return FALSE;
 }

 void visit(ElemType c)
 {
	 if	(!print_flag)
		printf("L ");
	 printf("->%d ",c);
   
 }

 Status InitList(LinkList &L)
 { 
   L=(LinkList)malloc(sizeof(LNode)); 
   if(!L) // 存储分配失败
     exit(OVERFLOW);
   L->next=NULL; // 指针域为空
   return OK;
 }

 Status DestroyList(LinkList &L)
 { 
   LinkList q;
   while(L)
   {
     q=L->next;
     free(L);
     L=q;
   }
   return OK;
 }

 Status ClearList(LinkList L) 
 { 
   LinkList p,q;
   p=L->next; // p指向第一个结点
   while(p) // 没到表尾
   {
     q=p->next;
     free(p);
     p=q;
   }
   L->next=NULL; 
   return OK;
 }

 Status ListEmpty(LinkList L)
 { 
   if(L->next) 
     return FALSE;
   else
     return TRUE;
 }

 int ListLength(LinkList L)
 { 
   int i=0;
   LinkList p=L->next; 
   while(p) 
   {
     i++;
     p=p->next;
   }
   return i;
 }

 Status GetElem(LinkList L,int i,ElemType &e) 
 { 
   int j=1; // j为计数器
   LinkList p=L->next; // p指向第一个结点
   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))
 { 
   int i=0;
   LinkList p=L->next;
   while(p)
   {
     i++;
     if(compare(p->data,e)) // 找到这样的数据元素
       return i;
     p=p->next;
   }
   return 0;
 }

 Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e)
 { 
   LinkList q,p=L->next; // p指向第一个结点
   while(p->next) 
   {
     q=p->next; 
     if(q->data==cur_e)
     {
       pre_e=p->data;
       return OK;
     }
     p=q; // p向后移
   }
   return INFEASIBLE;
 }

 Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e)
 { 
   LinkList p=L->next; // p指向第一个结点
   while(p->next) // p所指结点有后继
   {
     if(p->data==cur_e)
     {
       next_e=p->next->data;
       return OK;
     }
     p=p->next;
   }
   return INFEASIBLE;
 }

 Status ListInsert(LinkList L,int i,ElemType e) // 不改变L
 { 
   int j=0;
   LinkList p=L,s;
   while(p&&j<i-1) // 寻找第i-1个结点
   {
     p=p->next;
     j++;
   }
   if(!p||j>i-1) // i小于1或者大于表长
     return ERROR;
   s=(LinkList)malloc(sizeof(LNode)); // 生成新结点
   s->data=e; // 插入L中
   s->next=p->next;
   p->next=s;
   return OK;
 }

 Status ListDelete(LinkList L,int i,ElemType &e) 
 { 
   int j=0;
   LinkList p=L,q;
   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;
   free(q);
   return OK;
 }

 Status ListTraverse(LinkList L,void(*vi)(ElemType))
 
 { 
   LinkList p=L->next;
   print_flag = 0 ;
   while(p)
   {
     vi(p->data);
     p=p->next;
	 print_flag = 1 ;
   }
   if	( print_flag == 0 )
		printf(" L ");
   printf(" -> NULL ");
   printf("\n");
   printf( "\n 当前链表长度为 :%d \n ", ListLength(L) );
   return OK;
 }
void nowtime()
{
	char date[9]; 
	char date_show[11];
	char time[9]; 	
	_strdate(date); 
	_strtime(time); 
	date_show[0]='2';date_show[1]='0';date_show[2]=date[6];
	date_show[3]=date[7];date_show[4]='-',date_show[5]=date[0],date_show[6]=date[1];
	date_show[7]='-',date_show[8]=date[3],date_show[9]=date[4],date_show[10]='\0';
	cout<<"		"<<"现在日期是"<<date_show; 
	cout<<"	"<<"现在时间是"<<time<<endl; 
}

 void menu()
 {
	system("cls");
	system("color 24");
	cout << "\n\n\n\n" ;
	cout<<"	┌─────────────────────────┐\n"
		<<"	│请选择操作功能以回车结束 0--显示链表内容          │\n"
		<<"	├────────────┬────────────┤\n"
		<<"	│1--初始化链表           │2--插入链表元素         │\n"
		<<"	│3--查找链表元素         │4--删除指定链表元素     │\n"
		<<"	│5--查找元素前驱         │6--查找元素后继         │\n"
		<<"	│7--清空链表             │8--退出系统             │\n"
		<<"	└────────────┴────────────┘\n";
	nowtime();
 }

  void play_2()
 {
	cout << "	请选择插入元素的方式:0. 表头插入 1. 表尾插入 2.选择位置插入 (q退回):" ;
	cin >> c ;
	if	(c == 'q'||c == 'Q')
	{
		play() ;
		exit(0) ;
	}
	switch (c)
	{
	case '0':
		
		   printf("\n 请从表头依次插入元素并分别以回车输入最后以非数字结束(q退回):\n");
		   cin >> c_digit ;
		   c = c_digit[0] ;
		   if	(c == 'q'||c == 'Q')
		   {
			   play_2() ;
			   exit(0) ;
		   }
		while ( isdigit(c) )	//!((c >='A'&&c<='Z')||(c >='a'&&c<='z') )
			{					
				digit = atoi(c_digit) ;
						//play_2() ;

				i =	ListInsert(L,1,digit);
				if	(i)	
				{
					cout << "插入成功!\n" ;
				}
				else
					cout << "插入失败!\n" ;
				cin >> c_digit ;
				c = c_digit[0] ;
			}
		
		ListTraverse(L,visit);
		break ;
	case '1':
		{
		printf("\n 请从表尾依次插入元素并分别以回车输入最后以非数字结束(q退回):\n");
		cin >> c_digit ;
		c = c_digit[0] ;
		if	(c == 'q'||c == 'Q')
		{
			 play_2() ;
			 exit(0) ;
		}
		while ( isdigit(c) )	
			{					
				digit = atoi(c_digit) ;
						//play_2() ;

				i =	ListInsert(L,ListLength(L)+1,digit);
				if	(i)	
				{
					cout << "插入成功!\n" ;
				}
				else
					cout << "插入失败!\n" ;
				cin >> c_digit ;
				c = c_digit[0] ;
			}		
			/*do{
				cin >> digit ;
				i =	ListInsert(L,ListLength(L)+1,digit);
				if	(i)
					{
					cout << "插入成功!\n" ;					
					}
				else
					cout << "插入失败!\n" ;
				}while (!(digit == 0));//isdigit (digit)*/
		}
		ListTraverse(L,visit);
		break ;
	case '2':
		if	(!ListLength(L))
			printf(" \n	您的输入有误,当前链表为空,请重新选择操作 !\n  ");
		else
		{
			printf("\n 请输入您要从第几个元素之前插入新元素(1~~%d)(q退回):: ",ListLength(L)) ;
			cin >> c_digit ;
			c = c_digit[0] ;
			if	(c == 'q'||c == 'Q')
			{
				 play_2() ;
				 exit(0) ;
			}
			L_position = atoi(c_digit) ;
			if (L_position<1 || L_position>ListLength(L))
				printf("\n	超过元素插入范围,请重新操作. \n");
			else
			{
				printf("\n 请从第%d个元素之前依次插入元素并分别以回车输入最后以非数字结束(q退回):\n",L_position);
				cin >> c_digit ;
				c = c_digit[0] ;
				if	(c == 'q'||c == 'Q')
				{
					 play_2() ;
					 exit(0) ;
				}
				while ( isdigit(c)  )	
					{					
						digit = atoi(c_digit) ;
								//play_2() ;

						i =	ListInsert(L,L_position,digit);
						if	(i)	
						{
							cout << "插入成功!\n" ;
						}
						else
							cout << "插入失败!\n" ;
						cin >> c_digit ;
						c = c_digit[0] ;
					}	
			}
		}
		
		ListTraverse(L,visit);

		break ;
	default:
		printf(" \n	您的输入有误,请重新输入选择 !\n");
	}
 }

 void play_3()
 {
	cout << "	请选择查找元素的方式:0. 元素位置 1. 元素的值(q退回): " ;
	cin >> c ;
	if	(c == 'q')
	{
		play() ;
		exit(0) ;
	}
	switch (c)
	{
	case '0':		
		printf("请输入你要查找的第几个元素(1~~%d)(q退回): ",ListLength(L) );
		cin >> c_digit ;

⌨️ 快捷键说明

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