目录
1顺序表(规范)
2单链表(规范)
3总结
1顺序表(规范)
#include<iostream>
using namespace std;
#define MAXSIZE 100
#define ok -1
#define error -2
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
}Sqlist;
Status InitList(Sqlist &L);
void chushi(Sqlist &L,int x);
void shuchu(Sqlist L);
Status GetElem(Sqlist L,int i,ElemType &e);
Status ListInsert(Sqlist &L,int i,ElemType e);
Status Delete(Sqlist &L,int i);
Status Sort(Sqlist &L);
void SequenceSort(Sqlist &L,ElemType x);
int main()
{
Sqlist L;
int x,i,j;
Status m;
ElemType e;
x=InitList(L);
if(x==error) cout<<"初始化失败"<<endl;
else cout<<"初始化成功"<<endl;
cout<<"请决定输入元素的个数";
cin>>x;
chushi(L,x);
cout<<endl<<"请输入所取的位置"<<endl;
cin>>i;
x==GetElem(L,i,e);
if(x==error) cout<<"取值操作失败"<<endl;
else cout<<"取值成功,第"<<i<<"个位置的元素为"<<e<<endl;
cout<<"请输入要插入的个数";
cin>>x;
for(j=1;j<=x;j++)
{
cout<<endl<<"请输入要插入的位置及其元素";
cin>>i>>e;
m=ListInsert(L,i,e);
if(m==error)
{
cout<<"插入失败";break;
}
shuchu(L);
}
cout<<endl<<"请输入要删除的个数";
cin>>x;
for(j=1;j<=x;j++)
{
cout<<"请输入要删除的位置";
cin>>i;
m=Delete(L,i);
if(m==error)
{
cout<<"删除失败";
}
}
m=Sort(L);
if(m==error) cout<<"排序失败";
cout<<endl<<"请决定向有序表中插入几个数值:";
cin>>j;
for(i=1;i<=j;i++)
{
cout<<endl<<"请输入第"<<i<<"个要插入的元素";
cin>>x;
SequenceSort(L,x);
}
return 0;
}
Status InitList(Sqlist &L)//初始化开辟空间
{
L.elem=new ElemType[MAXSIZE];
if(!L.elem) return error;
L.length=0;
return ok;
}
void chushi(Sqlist &L,int x)//初始化赋值
{
ElemType m;
for(int i=0;i<x;i++)
{
cout<<"请对第"<<i+1<<"个位置赋值";
cin>>m;
L.elem[i]=m;
L.length++;
}
}
Status GetElem(Sqlist L,int i,ElemType &e)//根据位置进行取数据的取值操作
{
if(i<1||i>L.length) return error;
e=L.elem[i-1];
return ok;
}
void shuchu(Sqlist L)//输出操作
{
cout<<"顺序表为:";
for(int i=0;i<L.length;i++)
{
cout<<L.elem[i]<<" ";
}
}
Status ListInsert(Sqlist &L,int i,ElemType e)//插入
{
if(i<1||i>L.length+1) return error;
if(L.length==MAXSIZE) 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;
return ok;
}
Status Delete(Sqlist &L,int i)//删除
{
if(i<1||i>L.length+1) return error;
for(int j=i;j<=L.length-1;j++)
L.elem[j-1]=L.elem[j];
L.length--;
shuchu(L);
return ok;
}
Status Sort(Sqlist &L)
{
int t;
int i,k,j;
for(i=0;i<L.length;i++)
{
k=0;
for(j=0;j<L.length-i-1;j++)
{
if(L.elem[j]>=L.elem[j+1])
{
t=L.elem[j];
L.elem[j]=L.elem[j+1];
L.elem[j+1]=t;
k=1;
}
}
if(k==0) break;
}
cout<<endl<<"按照升序排序为:"<<endl;
shuchu(L);
return ok;
}
void SequenceSort(Sqlist &L,ElemType x)
{
int y=2;
ListInsert(L,y,x);
Sort(L);
}
2单链表(规范)
#include<iostream>
using namespace std;
#define ok -1
#define error -2
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status InitList(LinkList &L);
Status fuzhi(LinkList &L,int m);
void shuchu(LinkList L);
Status ListInsert(LinkList &L,int m,ElemType y);
Status Delete(LinkList &L,int n);//删除
void Sort(LinkList &L);
Status Length(LinkList L);
void SequenceSort(LinkList &L,ElemType x);
int main()
{
LinkList L;
int x,m,n;
ElemType y;
x=InitList(L);
if(x==error) cout<<"初始化失败";
else cout<<"初始化成功"<<endl;
cout<<"请决定输入几个元素";
cin>>m;
x=fuzhi(L,m);
if(x==error) cout<<"赋值失败";
shuchu(L);
cout<<"请决定插入元素的数量:";
cin>>x;
for(int i=1;i<=x;i++)
{
cout<<"请决定插入位置及其元素";
cin>>m>>y;
ListInsert(L,m,y);
shuchu(L);
}
cout<<endl<<"请输入要删除的个数";
cin>>x;
for(int j=1;j<=x;j++)
{
cout<<"请输入要删除的位置";
cin>>n;
m=Delete(L,n);
if(m==error)
{
cout<<"删除失败";break;
}
shuchu(L);
}
Sort(L);
shuchu(L);
cout<<endl<<"请决定向有序表中插入几个数值:";
cin>>m;
for(int i=1;i<=m;i++)
{
cout<<endl<<"请输入第"<<i<<"个要插入的元素";
cin>>x;
SequenceSort(L,x);
shuchu(L);
}
return 0;
}
Status InitList(LinkList &L)
{
L=new LNode;
if(L==NULL) return error;
L->next=NULL;
return ok;
}
Status fuzhi(LinkList &L,int m)
{
LNode *s,*r=L;
ElemType n;
for(int i=1;i<=m;i++)
{
cout<<"请输入第"<<i<<"个元素";
cin>>n;
s=new LNode;
s->data=n;
r->next=s;
r=s;
}
r->next=NULL;
return ok;
}
void shuchu(LinkList L)
{
LNode *p;
p=L->next;
cout<<"单链表内容为:";
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
Status ListInsert(LinkList &L,int x,ElemType y)//插入 前者为位置后者是元素
{
LNode *p=L,*s;
int j=0;
while(p&&(j<(x-1)))
{
p=p->next;
++j;
}
if(!p||j>(x-1)) return error;
s=new LNode;
s->data=y;
s->next=p->next;
p->next=s;
return ok;
}
Status Delete(LinkList &L,int n)
{
LNode *p=L,*q;
int j=0;
while((p->next)&&(j<(n-1)))
{
p=p->next;
++j;
}
if(!(p->next)||(j>n-1)) return error;
q=p->next;
p->next=q->next;
delete q;
return ok;
}
Status Length(LinkList L)
{
int i,j=0;
LNode *p=L->next;
while(p!=NULL)
{
p=p->next;
++j;
}
return j;
}
void Sort(LinkList &L)
{
int i=0,j=0,m=Length(L);
Status t;
LNode *p,*p1,*p2;
for(i=0;i<m-1;i++)
{
p=L->next;
for(j=0;j<m-i-1;j++)
{
p1=p;
p2=p1->next;
if(p1->data>p2->data)
{
t=p2->data;
p2->data=p1->data;
p1->data=t;
}
p=p->next;
}
}
printf("链表升序为:\n");
}
void SequenceSort(LinkList &L,ElemType x)
{
int y=2;
ListInsert(L,y,x);
Sort(L);
}
3总结
六、总结 //注意:必须写!
1.实验过程中遇到的问题及解决方法
问题1:不懂得直接在结构体给数组开辟空间和动态开辟数组空间的区别
解决方法:小组讨论依旧不懂,经老师解答懂了
问题2:对顺序表的长度和数组下标理解有些混乱,导致插入,删除,排序出错
解决方法:看课本并实践解决
2.收获
1如何动态开辟数组空间,以及创建结构体
2学会顺序表和单链表的基本操作(增删改查)