数据结构实验报告——线性表
顺序表
#include<bits/stdc++.h>
using namespace std;
const int LISTSIZE=10;///顺序存储的最大元素数量
const int maxn=100;///每次分配的元素个数
#define ERROR -1
#define OK 1
int n,m;
typedef int ElemType;
struct List
{
ElemType* elem;
int len,listsize;
};
void output(List &L) ///遍历顺序表
{
for(int i=0; i<L.len; i++)
{
cout<<L.elem[i];
if(i==L.len-1) puts("");
else cout<<" ";
}
}
void initlist(List &L)
{
L.elem=(ElemType*)malloc(LISTSIZE*sizeof(ElemType));
if(!L.elem) exit(ERROR);///内存分配失败
L.len=0;///当前存储的元素个数
L.listsize=LISTSIZE;
}
int insertlist(List &L,int pos,ElemType e)
{
if(pos<1||pos>L.len+1) return 0;///插入位置不合法
if(L.len>=L.listsize) ///当前元素的个数大于最大个数 需要申请空间
{
ElemType* newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTSIZE)*sizeof(ElemType));
if(!newbase) return ERROR;
L.elem=newbase;
L.listsize+=LISTSIZE;
}
ElemType *q=&(L.elem[pos-1]);
ElemType *p=&(L.elem[L.len-1]);
while(p>=q)
{
*(p+1)=*p;
p--;
}
*q=e;
L.len++;
return 1;
}
string Find(List &L,ElemType e,int &pos)
{
for(int i=0; i<L.len; i++)
if(L.elem[i]==e)
{
pos=i;
return "YES";
}
return "NO";
}
string Del(List &L,ElemType e)
{
int pos;
if(Find(L,e,pos)=="NO") return "Del Error!";
cout<<L.len<<endl;
ElemType *p=&(L.elem[pos]);
ElemType *q=&(L.elem[L.len-2]);
while(p<=q){
*p=*(p+1);p++;
}
L.len--;
return "Del Success!";
}
void Union(List &L1,List &L2,List &L){///递增合成递增的
int i=L1.len-1,j=L2.len-1,t=0;
while(i>=0&&j>=0){
t++;
if(L1.elem[i]>L2.elem[j]){
insertlist(L,t,L1.elem[i]);
i--;
}
else{
insertlist(L,t,L2.elem[j]);
j--;
}
}
while(i>=0){
t++;
insertlist(L,t,L1.elem[i]);
i--;
}
while(j>=0){
t++;
insertlist(L,t,L2.elem[j]);
j--;
}
}
int main()
{
/*List L;
initlist(L);
int n;
cin>>n;
for(int i=1; i<=n; i++)
{
int x;
cin>>x;
insertlist(L,i,x);
}
output(L);
for(int i=1; i<=2; i++)
{
cout<<"请输入您想要查找的元素"<<endl;
int x,pos;
cin>>x;
if(Find(L,x,pos)=="YES")
{
printf("查找成功,您想要查找的元素位置为%d\n",pos);
}
else printf("查找失败!\n");
}
for(int i=1; i<=10; i++)
{
cout<<"请输入您想要删除的元素"<<endl;
int x,pos;
cin>>x;
if(Del(L,x)=="Del Success!")
{
printf("删除成功,删除后的序列为\n");
output(L);
}
else printf("删除失败!\n");
}*/
List L1,L2,L;
///初始化
initlist(L1);
initlist(L2);
initlist(L);
cout<<"请输入表A的元素个数:\n"<<endl;
cin>>n;
cout<<"请输入表A的元素:\n"<<endl;
for(int i=1;i<=n;i++){
int x;cin>>x;
insertlist(L1,i,x);
}
cout<<"请输入表B的元素个数:\n"<<endl;
cin>>m;
cout<<"请输入表B的元素:\n"<<endl;
for(int i=1;i<=m;i++){
int x;cin>>x;
insertlist(L2,i,x);
}
Union(L1,L2,L);
cout<<"合并后的表C的元素为:\n"<<endl;
output(L);
return 0;
}
链表
#include<bits/stdc++.h>
using namespace std;
/*
(2)单链表的操作
① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。
② 实现该线性表的遍历。
③ 实现单链表的就地逆置。
④ 建立两个按值递增有序的单链表,将他们合并成一个按值递增有序的单链表。
要求利用原来的存储空间,并且新表中没有相同的元素。
*/
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}Lnode,*LinkList;
void initlist(LinkList &L){///尾插法建立链表
LinkList p,t;
int x;cin>>x;
L=t=(LinkList)malloc(sizeof(LNode));
while(x){
p=(LinkList)malloc(sizeof(LNode));
p->data=x;
t->next=p;
t=p;
cin>>x;
}
t->next=NULL;
}
void visit(LinkList p){///访问
cout<<p->data<<" ";
}
void output(LinkList L){///遍历
LinkList p=L->next;
while(p!=NULL){
visit(p);
p=p->next;
}
puts("");
}
void Reverse(LinkList &L){
LinkList p,q;
p=L->next;L->next=NULL;
while(p!=NULL){
q=p->next;
p->next=L->next;
L->next=p;
p=q;
}
}
void Union(LinkList &La,LinkList Lb){
LinkList pa,pb;
pa=La->next,pb=Lb->next;
free(Lb);
LinkList last=La;
while(pa&&pb){
if(pa->data<pb->data){
LinkList p=pa->next;
pa->next=NULL;
last->next=pa;
last=last->next;
pa=p;
}
else if(pa->data==pb->data){
LinkList p=pa->next;
pa->next=NULL;
last->next=pa;
last=last->next;
pa=p;
LinkList q=pb;
pb=pb->next;
free(q);
}
else{
LinkList p=pb->next;
pb->next=NULL;
last->next=pb;
last=last->next;
pb=p;
}
}
last->next=pa?pa:pb;
}
int main(){
LinkList La;
initlist(La);
output(La);
// Reverse(La);
// output(La);
LinkList Lb;
initlist(Lb);
Union(La,Lb);
output(La);
return 0;
}