1、本章内容小结
本章学习了线性表,下面通过两段代码展示顺序表和链表的基本操作。
//C++实现顺序表的基本操作 #include<iostream> #include<algorithm> using namespace std; #define MAXSIZE 1000 #define OVERFLOW -2 #define ERROR 1 typedef int ElemType; typedef int Status; //顺序表的建立:定义了一个名为SqList的结构体 typedef struct{ ElemType *elem; // 存储空间的基地址 int length; //当前长度 }SqList; // 顺序表的初始化 void InitList(SqList &L){ L.elem = new ElemType[MAXSIZE]; // 构造一个新的顺序表L 并为之分配大小为MAXSIZE的空间 if(L.elem == NULL){ cout<<"存储空间分配失败!"<<endl; exit(OVERFLOW); } // 存储空间分配失败退出 L.length = 0; cout<<"顺序表初始化完成"<<endl; } //顺序表读入值 void Create(SqList &L,int n,ElemType e){ for(int i = 0;i<n;i++){ ElemType e; cin>>e; L.elem[i] = e; L.length++; } } //顺序表插入值 int Insert(SqList &L,int i,ElemType e){ cout<<"请输入要插入的元素及其插的位置"<<endl; cin>>e>>i; if((i<1)||(i>L.length+1)) { cout<<"插入地址不合法"<<endl; return ERROR; } if(L.length == MAXSIZE) { cout<<"存储空间已满"<<endl; return ERROR; } for(int j = L.length-1;j>=i-1;j--){ L.elem[j+1] = L.elem[j]; } // 以上是从后比较的方法 可以边比较边移动 L.elem[i-1] = e; ++L.length; } int Delete(SqList &L,int i){ cout<<"请输入要删除的元素的位置"<<endl; cin>>i; if((i<1)||(i>L.length)) { cout<<"删除地址不合法"<<endl; return ERROR; } for(int j = i;j<=L.length;j++){ L.elem[j-1] = L.elem[j]; } --L.length; } int Print(SqList L) { if (L.length == 0) { return 1; } for (int k = 0; k < L.length; k++) { if(k == L.length-1) { cout<<L.elem[k]; } else{ cout<<L.elem[k]<<‘ ‘; } } } void Sort(SqList L){ sort(L.elem , L.elem + L.length); } int main(){ int n , x; cout<<"请输入n值"<<endl; cin>>n; // 输入数组的长度n SqList L; ElemType e; // 在主函数中进行声明 InitList(L); // 顺序表的初始化 loop: cout<<"请选择您想进行的操作"<<endl; cout<<"0.给顺序表读入值"<<endl; cout<<"1.给顺序表插入值"<<endl; cout<<"2.给顺序表删除值"<<endl; cout<<"3.给顺序表排序"<<endl; cout<<"4.输出顺序表"<<endl; cin>>x; switch(x){ case 0:{ cout<<"请输入数组的各个元素"<<endl; Create(L , n , e); cout<<"退出请按1,输入其他数字返回上级清单"<<endl; int p; cin>>p; if(p == 1){ return 0; } else{ goto loop; } break; } case 1:{ int i; Insert(L , i , e); cout<<"插入之后的数组"<<endl; Print(L); cout<<"退出请按1,输入其他数字返回上级清单"<<endl; int p; cin>>p; if(p == 1){ return 0; } else{ goto loop; } break; } case 2:{ int i; Delete(L , i); cout<<"删除之后的数组:"<<endl; Print(L); cout<<"退出请按1,输入其他数字返回上级清单"<<endl; int p; cin>>p; if(p == 1){ return 0; } else{ goto loop; } break; } case 3:{ Sort(L); Print(L); cout<<"退出请按1,输入其他数字返回上级清单"<<endl; int p; cin>>p; if(p == 1){ return 0; } else{ goto loop; } break; } case 4:{ Print(L); cout<<"退出请按1,输入其他数字返回上级清单"<<endl; int p; cin>>p; if(p == 1){ return 0; } else{ goto loop; } break; } default : { cout<<"请输入正确的数字!"<<endl; goto loop; break; } } return 0; }
//C++实现单链表的基本操作 #include<iostream> #include<algorithm> using namespace std; #define ERROR 1; typedef int ElemType; typedef int Status; //定义单链表中每个节点的存储结构 typedef struct LNode{ ElemType data; // 节点的数据域 struct LNode *next; // 节点的指针域 }LNode , *LinkList; //初始化 void InitList(LinkList L){ // 构造一个空的单链表L L = new LNode; L ->next = NULL; cout<<"初始化成功"<<endl; } //为链表填入元素 void Create(LinkList L, int n){ L = new LNode; LNode *r; L ->next = NULL; r = L; for(int i=0;i<n;++i){ LNode *p; p=new LNode; cin>>p ->data; p ->next = NULL; r ->next = p; r = p; } } //插入元素 int Insert(LinkList L , int i , ElemType e){ cout<<"请输入要插入的元素和他的位置"<<endl; cin>>e>>i; LNode *p; p = L; int j = 0; while(p!=NULL&&(j<i-1)){ p = p->next; // 移动指针 查找第i-1个节点 并将p指向该节点 } if(p==NULL||j>i-1) { return ERROR; } LNode *s; s=new LNode; s->data = e; s->next=p->next; p->next=s; // 这几步的操作分别将结点s的数据域置为e,s的指针域指向原来p的指针域指向的结点, // 再将p的指针域指向结点s,实现了结点s的插入。 } //删除元素 int Delete(LinkList L , int i) { cout<<"请输入要删除的元素的位置"<<endl; cin>>i; LNode *p; p = L; int j = 0; while(p->next != NULL&&(j<i-1)){ p = p->next; ++j; } if(p->next == NULL||j>i-1){ return ERROR; LNode *q; q=p->next; p->next=q->next; // 以上操作实现了将q结点删除 delete q; // 将该删除节点的空间释放 } } //排序 void Sort(LinkList L,int n){ sort(L,L+n); } //打印链表中的元素 Print(LinkList L) { LinkList P = L->next; while (P != NULL) { if(P->next==NULL){ cout<<P->data; } else{ cout<<P->data<<‘ ‘; } P = P->next; } } int main(){ int n,x; cout<<"请输入n值"<<endl; cin>>n; LinkList L; // 在主函数中声明链表L InitList(L); // 顺序表的初始化 loop: cout<<"请选择您想进行的操作"<<endl; cout<<"0.给链表读入值"<<endl; cout<<"1.给链表插入值"<<endl; cout<<"2.给链表删除值"<<endl; cout<<"3.给链表排序"<<endl; cout<<"4.输出链表"<<endl; cin>>x; switch(x){ case 0:{ cout<<"请输入数组的各个元素"<<endl; Create(L , n); cout<<"退出请按1,输入其他数字返回上级清单"<<endl; int p; cin>>p; if(p == 1){ return 0; } else{ goto loop; } break; } case 1:{ int i; ElemType e; Insert(L , i , e); cout<<"插入之后的数组"<<endl; Print(L); cout<<"退出请按1,输入其他数字返回上级清单"<<endl; int p; cin>>p; if(p == 1){ return 0; } else{ goto loop; } break; } case 2:{ int i; Delete(L , i); cout<<"删除之后的数组:"<<endl; Print(L); cout<<"退出请按1,输入其他数字返回上级清单"<<endl; int p; cin>>p; if(p == 1){ return 0; } else{ goto loop; } break; } case 3:{ Sort(L,n); Print(L); cout<<"退出请按1,输入其他数字返回上级清单"<<endl; int p; cin>>p; if(p == 1){ return 0; } else{ goto loop; } break; } case 4:{ Print(L); cout<<"退出请按1,输入其他数字返回上级清单"<<endl; int p; cin>>p; if(p == 1){ return 0; } else{ goto loop; } break; } default : { cout<<"请输入正确的数字!"<<endl; goto loop; break; } } return 0; }
2、存在的问题:规范性 参考C++高效编程 进行学习
代码不够友好 应增加注释量
3、参考资料:
学习sort函数
https://blog.csdn.net/w_linux/article/details/76222112
原文:https://www.cnblogs.com/suhan717/p/10533978.html