CCNU开课了,听了几节课,感觉神马都不会。。。。。
上了一节实验课,酱油,就敲了个结构体,初始化,啥都没敲出来,郁闷
然后开学了,各种无聊,但是感觉没时间搞ACM了。
坐了一晚上,终于搞定了实验一。。。累啊
先敲完了十二个基本的函数:
顺序表:
//代码很搓,大神请绕行,请勿鄙视
#include <stdio.h>
#include <cstdlib>
#include <iostream>
using namespace std;
#define ElemType int
const int LIST_INIT_SIZE=100;
const int LISTINCREMENT=10;
typedef struct
{
ElemType *elem;
int length;
int listsize;
int incrementsize;
}Sqlist;
void InitList(Sqlist &L,int maxsize,int incresize)//初始化
{
L.elem=new ElemType[maxsize];
L.length=0;
L.listsize=maxsize;
L.incrementsize=incresize;
}
void DestroyList(Sqlist &L)//销毁线性表
{
delete[]L.elem;
L.listsize=0;
L.length=0;
}
void ClearList(Sqlist &L)
{
delete[]L.elem;
L.length=0;
}
int ListEmpty(Sqlist L)
{
if(L.length==0)
return 1;
return 0;
}
int ListLength(Sqlist L)
{
return L.length;
}
void GetElem(Sqlist L,ElemType i,ElemType &e)
{
if(i<1||i>L.length)
{
cout<<i<<"不合法"<<endl;
return;
}
e=*(L.elem+i);
}
int LocateElem(Sqlist L,ElemType e)
{
int i=0;
int *p=L.elem;
while(i<=L.length&&*p++!=e) ++i;
if(i<=L.length) return i;
else
{
//cout<<e<<"不合法"<<endl;
return 0;
}
}
void PriorElem(Sqlist L,ElemType cur_e,ElemType &pre_e)
{
int i=1;
ElemType *p=L.elem+1;
while(i<=L.length&&*p!=cur_e)
{
p++;
i++;
}
if(i>L.length||i==1)
{
cout<<"求cur_e的PriorElem"<<" ";
cout<<cur_e<<"不合法"<<endl;
return;
}
else
{
pre_e=*--p;
return ;
}
}
void NextElem(Sqlist L,ElemType cur_e,ElemType &next_e)
{
int i=1;
ElemType *p=L.elem;
while(i<L.length&&*p!=cur_e)
{
i++;
p++;
}
if(i==L.length)
{
cout<<"求cur_e的NextElem"<<" ";
cout<<cur_e<<"不合法"<<endl;
return;
}
else
{
next_e=*++p;
return ;
}
}
void ListInsert(Sqlist &L,ElemType i,ElemType e)
{
ElemType *newbase,*p,*q;
if(i<1||i>L.length+1)
{
cout<<i<<"不合法"<<endl;
return;
}
if(L.length>=L.listsize)
{
if(!(newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType))))
{
cout<<"动态内存分配不够"<<endl;
}
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
q=L.elem+i;
for(p=L.elem+L.length;p>=q;--p)
*(p+1)=*p;
*q=e;
++L.length;
}
void ListDelete(Sqlist &L,int i,ElemType &e)
{
ElemType *p,*q;
if(i<1||i>L.length)
{
//cout<<i<<L.length<<endl;
cout<<i<<"不合法"<<endl;
return;
}
p=L.elem+i;
e=*p;
q=L.elem+L.length;
for(;p<q;++p)
*(p)=*(p+1);
L.length--;
}
void ListTraverse(Sqlist L)
{
int flag=0;
for(int i=1;i<=L.length;i++)
{
if(!flag)
{
cout<<L.elem[i];
flag=1;
}
else
cout<<" "<<L.elem[i];
}
cout<<endl;
}
int main()
{
Sqlist La,Lb;
InitList(La,LIST_INIT_SIZE,LISTINCREMENT);
InitList(Lb,LIST_INIT_SIZE,LISTINCREMENT);
int n,e;
cin>>n;
La.length=n;
for(int i=1;i<=n;i++)
cin>>La.elem[i];
/* 删除元素
ListDelete(La,4,e);
cout<<La.length<<endl;
for(int i=1;i<=La.length;i++)
cout<<La.elem[i]<<" ";
cout<<endl;
*/
// 销毁线性表 or 重置为空表
//DestroyList(La);
//ClearList(La);
/*
cout<<La.length<<endl;
if(ListEmpty(La)) // 判断是否为空表
cout<<"null"<<endl;
else
cout<<"occurpied"<<endl;
//
*/
// 得到第i个元素
/*
GetElem(La,6,e);
cout<<e<<endl;
*/
// 定为元素位置
/*
e=5;
cout<<LocateElem(La,e)<<endl;
*/
// 求 PriorElem or NextElem
/*
ElemType pre_e,next_e;
PriorElem(La,5,pre_e);
NextElem(La,5,next_e);
cout<<pre_e<<endl;
cout<<next_e<<endl;
*/
// 插入元素
/*
ListInsert(La,5,2);
ListTraverse(La);
*/
// 删除元素
/*
ListDelete(La,5,e);
ListTraverse(La);
cout<<e<<endl;
*/
return 0;
}
链表:(13个函数操作) (12个基本+1个create)
#include <iostream>
#include <cstdlib>
using namespace std;
#define ElemType int
typedef struct Lnode
{
ElemType data;
struct Lnode *next;
}Lnode,*LinkList;
void InitList(LinkList &L)
{
L=(LinkList)malloc(sizeof(Lnode));
if(!L)
cout<<"存储分配失败"<<endl;
L->next=NULL;
}
void DestroyList(LinkList &L)
{
LinkList q;
while(L->next)
{
q=L->next;
free(L);
L=q;
}
delete L->next;
}
void ClearList(LinkList L)
{
LinkList p,q;
p=L->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;
}
int ListEmpty(LinkList L)
{
if(L->next!=L)
return 1;
return 0;
}
int ListLength(LinkList L)
{
int i=1;
LinkList p=L->next;
while(p)
{
i++;
p=p->next;
}
return i;
}
void GetElem(LinkList L,int i,ElemType &e)
{
if(i==1)
{
e=L->data;
return ;
}
LinkList p=L->next;
int j=1;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i)
{
cout<<i<<" 不合法\n";
return ;
}
e=p->data;
}
int LocateElem(LinkList L,ElemType e)
{
LinkList p=L;
int i=0;
if(p->data==e)
return 1;
while(p)
{
i++;
if(p->data==e)
return i;
p=p->next;
}
}
void PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e)
{
if(LocateElem(L,cur_e)==2)
{
int e;
GetElem(L,1,e);
pre_e=e;
return;
}
LinkList q,p=L->next;
while(p->next)
{
q=p->next;
if(q->data==cur_e)
{
pre_e=p->data;
return ;
}
p=q;
}
cout<<cur_e<<"不合法\n";
}
void NextElem(LinkList L,ElemType cur_e,ElemType &next_e)
{
LinkList p=L->next;
while(p->next)
{
if(p->data==cur_e)
{
next_e=p->next->data;
return ;
}
p=p->next;
}
cout<<cur_e<<"不合法\n";
}
void ListInsert1(LinkList &L,int i,int e)//后插
{
LinkList p;
LinkList s;
s=(LinkList)malloc(sizeof(LinkList));
s->data=e;
p=L;
int k=1;
while(p)
{
if(k==i)
{
s->next=p->next;
p->next=s;
return;
}
k++;
p=p->next;
}
}
void ListInsert2(LinkList &L,int i,int e)//前插
{
LinkList p;
LinkList s;
s=(LinkList)malloc(sizeof(LinkList));
s->data=e;
p=L;
int k=1;
if(i==1)
{
s->next=L;
L=s;
return;
}
else
{
while(p)
{
if(k==i-1)
{
s->next=p->next;
p->next=s;
return;
}
p=p->next;
k++;
}
}
}
void ListDelete(LinkList L,int i,ElemType &e)
{
LinkList p=L,q;
if(i==1)
{
L->data=(L->next)->data;
}
int j=1;
while(p->next&&j<i-1)
{
p=p->next;
j++;
}
q=p->next;
p->next=q->next;
e=q->data;
free(q);
}
void ListTraverse(LinkList L)
{
LinkList p=L;
while(p->next)
{
int e=p->data;
cout<<e<<" ";
p=p->next;
}
cout<<p->data<<endl;
return ;
}
void CreateList(LinkList &L,ElemType a[],int n)
{
L=NULL;
LinkList s;
for(int i=n;i>0;i--)
{
s=new Lnode;
s->data=a[i];
s->next=L;
L=s;
}
}
int main()
{
LinkList La;
LinkList p,q;
InitList(La);
int n;
int e,pre_e,next_e;
int a[100];
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
CreateList(La,a,n);//创建链表
ListInsert1(La,3,222);
ListTraverse(La);
ListInsert2(La,3,22);
ListTraverse(La);//输出链表
return 0;
}
实验一 : 利用线性表实现两个整数集合的交、并、差的运算。
(日,直接数组模拟的嘛,吃饱了撑着用线性表。。。)
#include <stdio.h>
#include <cstdlib>
#include <iostream>
using namespace std;
#define ElemType int
const int LIST_INIT_SIZE=100;
const int LISTINCREMENT=10;
typedef struct
{
ElemType *elem;
int length;
int listsize;
int incrementsize;
}Sqlist;
void InitList(Sqlist &L,int maxsize,int incresize)//初始化
{
L.elem=new ElemType[maxsize];
L.length=0;
L.listsize=maxsize;
L.incrementsize=incresize;
}
void DestroyList(Sqlist &L)//销毁线性表
{
delete[]L.elem;
L.listsize=0;
L.length=0;
}
void ClearList(Sqlist &L)
{
delete[]L.elem;
L.length=0;
}
int ListEmpty(Sqlist L)
{
if(L.length==0)
return 1;
return 0;
}
int ListLength(Sqlist L)
{
return L.length;
}
void GetElem(Sqlist L,ElemType i,ElemType &e)
{
if(i<1||i>L.length)
{
cout<<i<<"不合法"<<endl;
return;
}
e=*(L.elem+i);
}
int LocateElem(Sqlist L,ElemType e)
{
int i=0;
int *p=L.elem;
while(i<=L.length&&*p++!=e) ++i;
if(i<=L.length) return i;
else
{
//cout<<e<<"不合法"<<endl;
return 0;
}
}
void PriorElem(Sqlist L,ElemType cur_e,ElemType &pre_e)
{
int i=1;
ElemType *p=L.elem+1;
while(i<=L.length&&*p!=cur_e)
{
p++;
i++;
}
if(i>L.length||i==1)
{
cout<<"求cur_e的PriorElem"<<" ";
cout<<cur_e<<"不合法"<<endl;
return;
}
else
{
pre_e=*--p;
return ;
}
}
void NextElem(Sqlist L,ElemType cur_e,ElemType &next_e)
{
int i=1;
ElemType *p=L.elem;
while(i<L.length&&*p!=cur_e)
{
i++;
p++;
}
if(i==L.length)
{
cout<<"求cur_e的NextElem"<<" ";
cout<<cur_e<<"不合法"<<endl;
return;
}
else
{
next_e=*++p;
return ;
}
}
void ListInsert(Sqlist &L,ElemType i,ElemType e)
{
ElemType *newbase,*p,*q;
if(i<1||i>L.length+1)
{
cout<<i<<"不合法"<<endl;
return;
}
if(L.length>=L.listsize)
{
if(!(newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType))))
{
cout<<"动态内存分配不够"<<endl;
}
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
q=L.elem+i;
for(p=L.elem+L.length;p>=q;--p)
*(p+1)=*p;
*q=e;
++L.length;
}
void ListDelete(Sqlist &L,int i,ElemType &e)
{
ElemType *p,*q;
if(i<1||i>L.length)
{
//cout<<i<<L.length<<endl;
cout<<i<<"不合法"<<endl;
return;
}
p=L.elem+i;
e=*p;
q=L.elem+L.length;
for(;p<q;++p)
*(p)=*(p+1);
L.length--;
}
void ListTraverse(Sqlist L)
{
int flag=0;
for(int i=1;i<=L.length;i++)
{
if(!flag)
{
cout<<L.elem[i];
flag=1;
}
else
cout<<" "<<L.elem[i];
}
if(!flag)
cout<<"null"<<endl;
else
cout<<endl;
}
void bing(Sqlist La,Sqlist Lb)
{
Sqlist Lc;
ElemType e;
InitList(Lc,LIST_INIT_SIZE,LISTINCREMENT);
for(int i=1;i<=La.length;i++)
ListInsert(Lc,Lc.length+1,La.elem[i]);
for(int i=1;i<=Lb.length;i++)
if(!LocateElem(Lc,Lb.elem[i]))
ListInsert(Lc,Lc.length+1,Lb.elem[i]);
ListTraverse(Lc);
}
void jiao(Sqlist La,Sqlist Lb)
{
Sqlist Lc;
ElemType e;
InitList(Lc,LIST_INIT_SIZE,LISTINCREMENT);
for(int i=1;i<=La.length;i++)
{
GetElem(La,i,e);
if(LocateElem(Lb,e))
ListInsert(Lc,Lc.length+1,e);
}
ListTraverse(Lc);
}
void cha(Sqlist La,Sqlist Lb)
{
Sqlist Lc;
ElemType e;
InitList(Lc,LIST_INIT_SIZE,LISTINCREMENT);
for(int i=1;i<=La.length;i++)
{
GetElem(La,i,e);
if(!LocateElem(Lb,e))
ListInsert(Lc,Lc.length+1,e);
}
ListTraverse(Lc);
}
int main()
{
Sqlist La,Lb;
InitList(La,LIST_INIT_SIZE,LISTINCREMENT);
InitList(Lb,LIST_INIT_SIZE,LISTINCREMENT);
cout<<"Input the length of set A :"<<endl;
cin>>La.length;
cout<<"Input the elements in set A :"<<endl;
for(int i=1;i<=La.length;i++)
cin>>La.elem[i];
cout<<"Input the length of set B :"<<endl;
cin>>Lb.length;
cout<<"Input the elements in set B :"<<endl;
for(int i=1;i<=Lb.length;i++)
cin>>Lb.elem[i];
cout<<"Union of set A and set B :"<<endl;
bing(La,Lb);
cout<<"Mix of set A and set B :"<<endl;
jiao(La,Lb);
cout<<"the difference set of A and B :"<<endl;
cha(La,Lb);
cout<<"the difference set of B and A :"<<endl;
cha(Lb,La);
//ListTraverse(La);
//ListTraverse(Lb);
return 0;
}