#include<iostream> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef int ElemType; #define MAXSIZE 100 typedef struct { ElemType *elem; int lenth; }Sqlist; typedef struct Lnode { ElemType data; Lnode *next; }*Linklist; Status InitList_Sq(Sqlist &L)//有序表的初始化 { L.elem=new ElemType[MAXSIZE]; if(!L.elem) exit(OVERFLOW); L.lenth=0; return OK; } void InputList_Sq(Sqlist &L)//顺序表输入数据 { int n; cout<<"请输入要输入的元素个数:"; cin>>n; cout<<"请输入每个元素的值:"; for(int i=0;i<n;i++) cin>>L.elem[i]; L.lenth=n; cout<<"输入成功!"<<endl<<endl; } Status LocateElem_Sq(Sqlist L,ElemType e)//顺序表的查找 { for(int i=0;i<L.lenth;i++) if(L.elem[i]==e) return i+1; return 0; } bool InsertList_Sq(Sqlist &L,ElemType e,int i)//顺序表的插入 { if(i<1||i>L.lenth) return ERROR; for(int j=L.lenth;j>=i;j--) L.elem[j]=L.elem[j-1]; L.elem[i-1]=e; L.lenth++; return OK; } bool DeleteList_Sq(Sqlist &L,int i,ElemType &e)//顺序表的删除 { if(i<1||i>L.lenth) return ERROR; e=L.elem[i-1]; for(int j=i-1;j<L.lenth;j++) L.elem[j]=L.elem[j+1]; L.lenth--; return OK; } Status Init(Linklist &l)//链表的初始化 { l=new Lnode; l->next=NULL; return OK; } void InputLink(Linklist &l)//链表的输入数据 { Lnode *p,*r; int n; cout<<"请输入要输入的元素个数:"; cin>>n; cout<<"请输入每个元素的值:"; p=l->next; r=l; for(int i=0;i<n;i++) { p=new Lnode; cin>>p->data; p->next=NULL; r->next=p; r=p; } } Status find(Linklist &l,int n)//链表的查找 { int i=n; Lnode *p=l; while(i--&&p) p=p->next; if(p) cout<<"第"<<n<<"位数是"<<p->data<<endl<<endl; else cout<<"查找失败!"<<endl<<endl; } Status Insertlink(Linklist &l,int i,ElemType n)//链表的插入 { Lnode *p; p=l; if(i<1) return ERROR; i--; while((i--)&&p) p=p->next; if(!p) return ERROR; Lnode *r; r=new Lnode; //为什么没有这句会执行不下去??不是已经把r定义为指向Lnode类型的指针了嘛??? r->data=n; r->next=p->next; p->next=r; return OK; } Status Delete(Linklist &l,int i,ElemType &e)//链表的删除 { Lnode *p=l,*r; i--; while(i--&&p) p=p->next; if(!p) return ERROR; else { e=p->next->data; r=p->next; p->next=r->next; delete r; return OK; } } void convert(Linklist &l)//链表的原地逆置 { Lnode *p,*r; r=l->next; l->next=NULL;//重点易忽略处 while(r) { p=r->next; r->next=l->next; l->next=r; r=p; } } void output(Linklist &l)//链表的输出 { Lnode *p; p=l->next; while(p) { cout<<p->data<<" "; p=p->next; } cout<<endl<<endl; } void output1(Sqlist L)//顺序表的输出 { for(int i=0;i<L.lenth;i++) cout<<L.elem[i]<<" "; cout<<endl<<endl; } int main() { Sqlist L; Lnode *l; ElemType n,i,e,temp; int choose; cout<<"******************线性表的基本操作与实现******************"<<endl; cout<<" 1.创建顺序表"<<endl; cout<<" 2.顺序表输入数据"<<endl; cout<<" 3.顺序表查找"<<endl; cout<<" 4.顺序表插入"<<endl; cout<<" 5.顺序表删除"<<endl; cout<<" 6.顺序表输出"<<endl; cout<<" 7.创建链表"<<endl; cout<<" 8.链表输入数据"<<endl; cout<<" 9.链表查找"<<endl; cout<<" 10.链表插入"<<endl; cout<<" 11.链表删除"<<endl; cout<<" 12.链表的原地逆置"<<endl; cout<<" 13.链表的输出"<<endl; cout<<" 0.退出"<<endl; cout<<"************************我是分界线************************"<<endl<<endl; choose=-1; while(choose) { cout<<"请输入你的选择:"; cin>>choose; switch(choose) { case 0:break; case 1: if(InitList_Sq(L)) cout<<"创建顺序表成功!"<<endl<<endl; else cout<<"创建顺序表失败!"<<endl<<endl; break; case 2: InputList_Sq(L); break; case 3: cout<<"输入要查找的数:"; cin>>e; temp=LocateElem_Sq(L,e); if(temp) cout<<e<<"是第"<<temp<<"位数"<<endl<<endl; else cout<<"查找失败!没有这样的数 "<<endl<<endl; break; case 4: cout<<"请输入要插入的数据及其位置:"; cin>>e>>i; if(InsertList_Sq(L,e,i)) cout<<"插入成功!"<<endl<<endl; else cout<<"插入失败!"<<endl<<endl; break; case 5: cout<<"请输入要删除的数的位置:"; cin>>i; if(DeleteList_Sq(L,i,e)) cout<<"删除成功,你删除的数是"<<e<<endl<<endl; else cout<<"删除失败!"<<endl<<endl; break; case 6: cout<<"此时的顺序表中的数据为:"; output1(L); break; case 7: if(Init(l)) cout<<"创建链表成功!"<<endl<<endl; break; case 8: InputLink(l); cout<<"输入数据成功!"<<endl<<endl; break; case 9: cout<<"请输入要查找的数据的位置:"; cin>>n; find(l,n); break; case 10: cout<<"请输入要插入的元素的位置及值:"; cin>>i>>n; if(Insertlink(l,i,n)) cout<<"插入成功!"<<endl<<endl; else cout<<"插入失败!"<<endl<<endl; break; case 11: cout<<"请输入要删除的元素的位置:"; cin>>i; if(Delete(l,i,e)) cout<<"删除成功,删除的元素是"<<e<<endl<<endl; else cout<<"删除失败!"<<endl<<endl; break; case 12: convert(l); cout<<"逆置成功!"<<endl<<endl; break; case 13: cout<<"此时的链表中的数据为:"<<endl; output(l); break; default: cout<<"无效输入!"<<endl<<endl; break; } } return 0; }