1. 有两张非递增有序的线性表A,B,采用顺序存储结构,两张表合并用c表存,要求C为非递减有序的,然后删除C表中值相同的多余元素。
#include<iostream>
using namespace std;
#define MAXSIZE 100
#define OVERFLOW -1
#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;
//顺序存储
typedef struct
{
ElemType *elem;
int length;
}sqlist;
sqlist la,lb,lc;
sqlist InitList()
{
sqlist L;
L.elem=new ElemType[MAXSIZE];
if(!L.elem) exit(OVERFLOW);
L.length=0;
return L;
}
sqlist ListInsert(sqlist &L,int i,ElemType e)
{
if(L.length==MAXSIZE) exit(OVERFLOW);
L.elem[i]=e;
++L.length;
return L;
}
sqlist Listsort(sqlist &L)
{
int i,j;
for(i=0;i<L.length/2;i++)
{
j=L.elem[i];
L.elem[i]=L.elem[L.length-i-1];
L.elem[L.length-i-1]=j;
}
return L;
}
sqlist ListDelete(sqlist &L)
{int i = 0, j = 0, k = 0;
if(L.length > 0)
{
for(i = 0; i < L.length; ++i) //删除相同元素,
{
for(j=i+1;j<L.length;j++)
{
if(L.elem[i]==L.elem[j])//从第一个开始,和第二个以及之后的比较,
{
for(k=j;k<L.length;k++)
{
L.elem[k]=L.elem[k+1];
}
L.length--; //每删除一个元素长度减一
j--;
}
}
}
}
return L;
}
void printlist(sqlist &L)
{
for(int i=0;i<=L.length-1;i++)
{
cout<<L.elem[i]<<" ";
}
}
sqlist addlist(sqlist *la, sqlist *lb, sqlist *lc)
{
int i = 0, j = 0, k = 0;
while(i < la->length && j < lb->length)
{
if(la->elem[i] <= lb->elem[j])
{
lc->elem[k] = lb->elem[j];
j++;
k++;
}
else
{
lc->elem[k] = la->elem[i];
i++;
k++;
}
}
while(i < la->length)
{
lc->elem[k] = la->elem[i];
k++;
i++;
}
while(j < lb->length)
{
lc->elem[k] = lb->elem[j];
k++;
j++;
}
lc->length = k;
return *lc;
}
int main()
{
int num,num1;
int p,t;
la = InitList();
lb = InitList();
lc = InitList();
cout<<"请输入链表a的长度:";
cin>>num;//输入la的长度
cout<<endl;
for(int i=0;i<=num-1;i++)
{
cin>>p;
ListInsert(la,i,p);
}
cout<<endl;
cout<<"请输入链表b的长度:";
cin>>num1;//输入lb的长度
cout<<endl;
for(int i=0;i<=num1-1;i++)
{cin>>t;
ListInsert(lb,i,t);
}
cout<<"链表a:"<<endl;
printlist(la);
cout<<endl;
cout<<"链表b:"<<endl;
printlist(lb);
cout<<endl;
addlist(&la, &lb, &lc);
cout<<"合并后的c链表:"<<endl;
printlist(lc);
cout<<endl;
ListDelete(lc);
cout<<"删除相同多余元素后的c链表:"<<endl;
printlist(lc);
cout<<endl;
Listsort(lc);
cout<<"排完序后的c链表:"<<endl;
printlist(lc);
return 0;
}
2. 有两张非递减有序的线性表A,B,采用链式存储结构,两张表合并用c表示,要求C为非递增有序的,然后删除C表中值相同的多余元素。
#include<iostream>
using namespace std;
typedef int ElemType;
//链式存储
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList InitList(LinkList &L)
{
L=new LNode;
L->next=NULL;
return L;
}
LinkList ListInsert(LinkList &L,ElemType e)
{LinkList p;
InitList(p);
p=L;
while(p->next!=NULL)
{
p=p->next;
}
LinkList s;
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return L;
}
void CreateList(LinkList &L,int n)
{
LNode *q = L;
int i;
cout<<"请输入链表的数据"<<endl;
for(i=0;i<n;i++)
{
LinkList p;
p=new LNode;
cin>>p->data;
p->next=q->next;q->next=p;
}
}
LinkList AddList(LinkList &la,LinkList &lb,LinkList &lc,int n)
{
int i;
LinkList pa;
LinkList pb;
LinkList pc;
pa=new LNode;
pb=new LNode;
pa=la;
pb=lb;
pa=pa->next;
pb=pb->next;
for(i=0;i<=n+1;i++)
{
if(pa&&pb){
if(pa->data>pb->data)
{
pc=new LNode;
InitList(pc);
pc->data=pa->data;
pa=pa->next;
pc->next=lc->next;lc->next=pc;
}
else if(pa->data<pb->data)
{
pc=new LNode;
InitList(pc);
pc->data=pb->data;
pb=pb->next;
pc->next=lc->next;lc->next=pc;
}
else if(pa->data=pb->data)
{
pc=new LNode;
InitList(pc);
pc->data=pa->data;
pa=pa->next;
pb=pb->next;
pc->next=lc->next;lc->next=pc;
}
}
else if(pa&&!pb)
{
pc=new LNode;
InitList(pc);
pc->data=pa->data;
pa=pa->next;
pc->next=lc->next;lc->next=pc;
}
else if(pb&&!pa)
{
pc=new LNode;
InitList(pc);
pc->data=pb->data;
pb=pb->next;
pc->next=lc->next;lc->next=pc;
}
}
return lc;
}
void printList(LinkList &L)
{
LNode *q = L->next;
while(q){
cout<<q->data<<" ";
q=q->next;}
cout<<endl;
}
void sortList(LinkList &L)
{
int a[100];
int k=0,w=0;
LNode *q = L->next;
while(q)
{
a[k]=q->data;
q=q->next;
k++;
}
for(w=k-1;w>=0;w--)
{
cout<<a[w]<<" ";
}
}
int main(){
LinkList la,lb,lc;
InitList(la);
InitList(lb);
InitList(lc);
int n,m;
cout<<"请输入链表A的长度"<<endl;
cin>>n;
CreateList(la,n);
cout<<"请输入链表B的长度"<<endl;
cin>>m;
CreateList(lb,m);
int n1=n+m;
AddList(la,lb,lc,n1);
sortList(lc);
}
3. 约瑟夫问题:编号为1,2,..n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
提示:本题采用循环链表实现,结点数据域包含num,psw,功能初始化循环链表,插入数据,删除结点(重点)。主函数调用。
#include<iostream>
using namespace std;
typedef struct Node
{
int num;
int password;
struct Node *next;
}CircleNode,*CircleList;
CircleList InitList(CircleList &L)
{
L=new CircleNode;
L->next=L;
return L;
}
CircleList ListInsert(CircleList &L,int n)
{
int i;
int s;
CircleList q=L;
for(i=1;i<=n;i++)
{
CircleList p;
InitList(p);
p->num=i;
cout<<"第"<<i<<"人"<<"输入密码:"<<endl;
cin>>s;
p->password=s;
q->next=p;
q=q->next;
}
q->next=L;
return L;
}
void printList(CircleList L,int n)
{
cout<<"约瑟夫环的人数以及对应密码分别是:"<<endl;
int i;
CircleList w=L;
for(i=1;i<=n;i++)
{
cout<<"第"<<w->next->num<<"个人,密码"<<w->next->password<<endl;
w=w->next;
}
}
void Knockout(CircleList L,int n,int m)
{
CircleNode *cur=L;
CircleNode *prev=L;
int i;
while(n--)
{
for(i=1;i<=m;)
{
if(cur->next!=L)
{
prev=cur;
cur=cur->next;
}
else
{
prev=L;
cur=L->next;
}
++i;
}
cout<<"出列的人是第"<<cur->num<<"个人,密码是"<<cur->password<<endl;
m=cur->password;
prev->next=cur->next;
free(cur);
//free函数的作用是释放当前指针指向的内存块单元的空间.free完之后指针仍然指向原来的堆地址,即仍然可以继续使用,
// free只是释放了malloc等所申请的内存,并不改变指针的值,指向的下一个节点没变
//也就是说malloc申请的内存单元,经过free(cur)以后
//这片内存单元就空闲了出来给其他地方使用了.
//但是要注意:经过free以后,cur还是指向有实际的地址的,但是这个指针
//所指向的位置是空闲的,所以这个cur指针也没有作用了,被称为"悬空指针".
//类似C++里面的DELETE指令.
}
}int main()
{
int n,m;
CircleList L;
InitList(L);
cout<<"请输入约瑟夫环的人数:";
cin>>n;
cout<<"请输入m值:";
cin>>m;
ListInsert(L,n);
printList(L,n);
Knockout(L,n,m);
return 0;
}
free()函数的理解: