📄 操作链表.cpp
字号:
#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 + -