学了一学期数据结构(新手小白一个),很多代码都是从书上学习,算是自己学习的一个总结
分为六大块
1.顺序表的取值(根据位置取值)
2.顺序表的插入
3.顺序表的查找
4.顺序表的删除
5.顺序表的合并
定义
#include <stdlib.h>
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int ElemType ;
typedef int Status;
using namespace std;
typedef struct//最开始的定义
{
ElemType *elem;//因为定义的是指针所以要给他分配内存
int length;
}SqList;
Status InitList(SqList &L)//初始化分配空间
{
L.elem=new ElemType[MAXSIZE];//给指针分配空间
if(!L.elem)exit(OVERFLOW);//如果存储失败就退出
L.length=0;
return OK;
}
1.顺序表的取值
Status GetElem(SqList L,int i,ElemType &e)
//这个e的作用是返回值给主函数
{
if(i<1||i>L.length) return ERROR;//判断i值是否合法
e=L.elem[i-1];//因为是顺序表知道位置可以直接取值
return OK;
}
int main()
{
SqList L;
InitList(L);
cin>>L.length;
for(int i=0;i<L.length;i++)
{cin>>L.elem[i];}
int i;
ElemType x;
cin>>i;
GetElem(L, i, x);
cout<<x;
return 0;
}
2.顺序表的查找
找到就输出位置,找不到就输出-1
Status LocateElem(SqList L,ElemType e)
{
for(int i=0;i<L.length;i++)
{
if(L.elem[i]==e)
{return i+1;}
}
return -1;
}
int main()
{
SqList L;
InitList(L);
cin>>L.length;
for(int i=0;i<L.length;i++)
{cin>>L.elem[i];}
ElemType x;
cin>>x;
cout<<LocateElem(L, x);
return 0;
}
3.顺序表的插入
//在第i个位置插入,实际是在顺序表的【i-1】位置
//操作前输出一遍,操作后输出一遍
Status ListInsert(SqList &L,int i,ElemType e)
{int j;
if(i<1||i>L.length)return ERROR;
if(L.length==MAXSIZE)return ERROR;
if(i>1&&i<L.length){
for( j=L.length-1;j>=i-1;j--)
{ L.elem[j+1]=L.elem[j];
//i和后面的都往后一位
}
++L.length;
L.elem[i-1]=e;
}
if(i==L.length)
{++L.length;L.elem[i]=e;}
if(i==1)//必须用后插法才可以
{++L.length;
for(int k=L.length;k>=0;k--)
{L.elem[k+1]=L.elem[k];}
L.elem[i-1]=e;
}
return OK;
}
int main()
{int i;
SqList L;
InitList(L);
cin>>L.length;
for( i=0;i<L.length;i++)
{cin>>L.elem[i];}
int e;
cin>>e;
ElemType x;
cin>>x;
for(i=0;i<L.length;i++)
{cout<<L.elem[i]<<" ";
}
cout<<endl;
ListInsert(L, e,x);
for(i=0;i<L.length;i++)
{cout<<L.elem[i]<<" ";}
return 0;
}
4.顺序表的删除
Status ListDelete(SqList &L,int i)
{int j;
if(i<1||i>L.length)return ERROR;
for(j=i;j>L.length;j++)
L.elem[j]=L.elem[j+1];
--L.length;
return OK;
}
int main()
{
SqList L;
InitList(L);
cin>>L.length;
for(int j=0;j<L.length;j++)
{cin>>L.elem[j];}
int i;
cin>>i;
for(int j=0;j<L.length;j++)
{cout<<L.elem[j]<<" ";}
cout<<endl;
ListDelete(L, i);
for(int j=0;j<L.length;j++)
{cout<<L.elem[j]<<" ";}
return 0;
}
5.顺序表的合并
按从小到大排列
void MergeList(SqList LA,SqList LB,SqList &LC)
{
int *pa,*pb,*pc,*pa_last,*pb_last;
LC.length=LA.length+LB.length;//新表长度为两表长度之和
LC.elem=new ElemType[LC.length];//分配内存
pc=LC.elem;
pa=LA.elem;
pb=LB.elem;
pa_last=LA.elem+LA.length-1;//指针指向la最后一个元素
pb_last=LB.elem+LB.length-1;//指针指向lb最后一个元素
while((pa<=pa_last)&&(pb<=pb_last))
{
if(*pa<=*pb)
*pc++=*pa++;
else *pc++=*pb++;
}
while(pa<=pa_last) *pc++=*pa++;//依次摘取其中值比较小的一个
while(pb<=pb_last) *pc++=*pb++;
}
int main()
{
SqList LA;
InitList(LA);
cin>>LA.length;
for(int i=0;i<LA.length;i++)
{cin>>LA.elem[i];}
SqList LB;
InitList(LB);
cin>>LB.length;
for(int i=0;i<LB.length;i++)
{cin>>LB.elem[i];}
SqList LC;
InitList(LC);
MergeList(LA,LB,LC);
for(int i=0;i<LC.length;i++)
{cout<<LC.elem[i]<<" ";}
return 0;
}