第1关基于链表的两个一元多项式的基本运算
#include <iostream>
#include <string>
using namespace std;
typedef struct LNode
{
int coe; //系数coe
int exp; //指数exp
struct LNode *next;
}LNode,*LinkList;
void CreatePolynomial(LinkList &L,int n)
{//按指数exp从大到小存多项式
L=new LNode;
L->next=NULL;
for(int i=0;i<n;i++)
{
LinkList p=new LNode;
cin>>p->coe>>p->exp;
LinkList pre=L,cur=L->next; //pre和cur是多项式链表的工作指针,分别初始化为头结点和首元结点
while(cur&&p->exp<cur->exp) //若待插入项的指数小于当前结点的指数,指针pre指向当前结点,当前结点的指针cur后移
{
pre=cur;
cur=cur->next;
}
p->next=cur; //待插入项的指数不小于当前结点的指数时,用头插法插入节点
pre->next=p;
}
}
void OutputPolynomial(LinkList L)
{//输出多项式
if(!L||!L->next) cout<<0;
LinkList p=L->next; //p是多项式链表的工作指针,初始化为首元结点
while(p)
{
if(p==L->next) //p指向首元结点时,根据指数的情况输出多项式
{
if (p->exp!=0)
cout<<p->coe<<"x^"<<p->exp;
else
cout<<p->coe;
}
else //p指向其他结点时,根据系数的正负和指数的情况输出多项式
{
if(p->coe>0) cout<<"+";
if(p->exp!=0)
cout<<p->coe<<"x^"<<p->exp;
else
cout<<p->coe;
}
p=p->next;
}
cout<<endl;
}
LinkList Add(LinkList LA,LinkList LB)
{//多项式的加法运算
/**************begin************/
LinkList LC,pa,pb,pc;
pa=LA->next;
pb=LB->next;
CreatePolynomial(LC,0);
pc=LC;
while(pa&&pb)
{
if(pa->exp==pb->exp)
{
int sum=pa->coe+pb->coe;
if(sum)
{
pa->coe=sum;
pc->next=pa;
pc=pa;
pa=pa->next;
pb=pb->next;
}
else
{
pa=pa->next;
pb=pb->next;
}
}
else if (pa->exp>pb->exp)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else {
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
return LC;
/**************end************/
}
void Minus(LinkList LA,LinkList LB)
{//多项式的减法
/**************begin************/
LinkList p=LB->next;
while(p)
{
p->coe*=-1;
p=p->next;
}
OutputPolynomial(Add(LA, LB));
/**************end************/
}
void Mul(LinkList LA,LinkList LB)
{//多项式的乘法
/**************begin************/
LinkList LC;
LinkList pa=LA->next;
LinkList pb=LB->next;
CreatePolynomial(LC, 0);
LinkList temp;
CreatePolynomial(temp, 0);
while(pa)
{
while(pb)
{
LinkList p=new LNode;
p->next=NULL;
p->coe=pa->coe*pb->coe;
p->exp=pa->exp+pb->exp;
temp->next=p;
LC=Add(LC,temp);
pb=pb->next;
}
pb=LB->next;
pa=pa->next;
}
OutputPolynomial(LC);
/**************end************/
}
void Diff(LinkList L)
{//多项式的求导运算
LinkList p=L->next; //p是链表L的工作指针,初始化为首元结点
LinkList r=NULL; //r是删除操作的辅助指针
while(p)
{
p->coe*=p->exp;
p->exp--;
if(p->exp<0) //所有数据的指数大于等于0
{
r=p;
p=p->next;
delete r;
}
else
{
p=p->next;
}
}
OutputPolynomial(L);
}
void Opt(LinkList &LA,LinkList &LB,string s)
{//依据字符选择多项式的加法、减法、乘法和求导运算
if(s=="+") OutputPolynomial(Add(LA, LB));
if(s=="-") Minus(LA, LB);
if(s=="*") Mul(LA, LB);
if(s=="'")
{
Diff(LA);
Diff(LB);
}
}
int main()
{
int n; //总计有n组数据
cin>>n;
while(n--)
{
int a,b;
cin>>a>>b;
LinkList LA,LB;
CreatePolynomial(LA,a);
CreatePolynomial(LB,b);
string s;
cin>>s;
Opt(LA,LB,s);
}
return 0;
}
第2关 基于链表的两个递增有序序列的合并
#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_R(LinkList &L,int n)
{//后插法创建单链表
L=new LNode;
L->next=NULL;
LinkList r=L;
for(int i=0;i<n;i++)
{
LinkList p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
void PrintList(LinkList &L)
{//打印依次输出链表中的数据
L=L->next;
while(L){
if(L->next!=NULL) cout<<L->data<<" ";
else cout<<L->data;
L=L->next;
}
cout<<endl;
}
void MergeList(LinkList &LA,LinkList &LB)
{//求基于链表的两个递增有序序列的合并
/**************begin************/
LinkList r1,r2,r3;
r1=LA->next;
r2=LB->next;
r3=LA;
while (r1!=NULL && r2!=NULL)
{
if (r1->data<r2->data)
{
r3->next=r1;
r3=r1;
r1=r1->next;
}
else if (r1->data==r2->data)
{
r3->next=r1;
r3=r1;
r1=r1->next;
r2=r2->next;
}
else
{
r3->next=r2;
r3=r2;
r2=r2->next;
}
}
r3->next=r1?r1:r2;
/**************end************/
}
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
LinkList LA,LB;
CreateList_R(LA,n);
CreateList_R(LB,m);
MergeList(LA,LB);
PrintList(LA);
}
return 0;
}
第3关 基于链表的两个非递减有序序列的合并
#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_R(LinkList &L,int n)
{//后插法创建单链表
L=new LNode;
L->next=NULL;
LinkList r=L;
for(int i=0;i<n;i++)
{
LinkList p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
void PrintList(LinkList &L)
{//打印依次输出链表中的数据
L=L->next;
while(L){
if(L->next!=NULL) cout<<L->data<<" ";
else cout<<L->data;
L=L->next;
}
cout<<endl;
}
void MergeList(LinkList &LA,LinkList &LB,LinkList &LC)
{//求基于链表的两个非递减有序序列的合并
/**************begin************/
LinkList pa,pb,pc,q;
pa=LA->next;
pb=LB->next;
LC =new LNode;
pc=LC;
LC->next=NULL;
while(pa||pb ){
if(!pa) {
q=pb;
pb=pb->next;
}
else if(!pb) {
q=pa;
pa=pa->next;
}
else if(pa->data<=pb->data){
q=pa;
pa=pa->next;
}
else {
q=pb;
pb=pb->next;
}
q->next = LC->next;
LC->next = q;
}
delete LB;
/**************end************/
}
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
LinkList LA,LB,LC;
CreateList_R(LA,n);
CreateList_R(LB,m);
MergeList(LA,LB,LC);
PrintList(LC);
}
return 0;
}
第4关 基于链表的两个集合的交集
#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_R(LinkList &L,int n)
{//后插法创建单链表
L=new LNode;
L->next=NULL;
LinkList r=L;
for(int i=0;i<n;i++)
{
LinkList p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
void PrintList(LinkList &L)
{//打印依次输出链表中的数据
L=L->next;
while(L){
if(L->next!=NULL) cout<<L->data<<" ";
else cout<<L->data;
L=L->next;
}
cout<<endl;
}
void Intersection(LinkList &LA,LinkList &LB)
{//求基于链表的两个集合的交集
/**************begin************/
LinkList pc=LA,pa=LA->next,pb=LB->next;
while(pa&&pb)
{
if(pa->data==pb->data)
{
pc->next=pa;
pc=pa;
if(pb->next==NULL||pa->next==NULL)
{
pc->next=NULL;
break;
}
pa=pa->next;
pb=pb->next;
}
else if(pa->data > pb->data) pb=pb->next;
else if(pa->data < pb->data) pa=pa->next;
}
pc->next=NULL;
delete LB;
return;
/**************end************/
}
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
LinkList LA,LB;
CreateList_R(LA,n);
CreateList_R(LB,m);
Intersection(LA,LB);
PrintList(LA);
}
return 0;
}
第5关 基于链表的两个集合的差集
#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_R(LinkList &L,int n)
{//后插法创建单链表
L=new LNode;
L->next=NULL;
LinkList r=L;
for(int i=0;i<n;i++)
{
LinkList p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
void PrintList(LinkList &L)
{//依次输出链表中的数据和该集合的元素个数
L=L->next;
int s=0;
while(L)
{
if(L->next!=NULL) cout<<L->data<<" ";
else cout<<L->data;
L=L->next;
s++;
}
cout<<endl<<s<<endl;
}
void Difference(LinkList &LA,LinkList &LB)
{//求基于链表的两个集合的差集
/**************begin************/
LinkList pa, pb, p;
pa = LA->next;
pb = LB->next;
p = LA;
while ( pa&&pb ) {
if ( pa->data == pb->data ) {
pa = pa->next;
pb = pb->next;
} else if ( pa->data > pb->data ) {
pb = pb->next;
} else {
p->next = pa;
pa = pa->next;
p = p->next;
}
if ( pb==NULL ) {
p->next = pa;
}
}
/**************end************/
}
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
LinkList LA,LB;
CreateList_R(LA,n);
CreateList_R(LB,m);
Difference(LA,LB);
PrintList(LA);
}
return 0;
}
第6关 链表的分解
#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_R(LinkList &L,int n)
{//后插法创建单链表
L=new LNode;
L->next=NULL;
LinkList r=L;
for(int i=0;i<n;i++)
{
LinkList p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
void PrintList(LinkList &L)
{//打印依次输出链表中的数据
L=L->next;
while(L){
if(L->next!=NULL) cout<<L->data<<" ";
else cout<<L->data;
L=L->next;
}
cout<<endl;
}
void Decompose(LinkList &LA,LinkList &LB,LinkList &LC)
{//链表的分解
/**************begin************/
LB=new LNode;LB->next=NULL;
LC=new LNode;LC->next=NULL;
LinkList pa,pb,pc;
pa=LA->next;
pb=LB;
pc=LC;
while(pa){
if(pa->data>0){
pc->next=pa;
pc=pc->next;
pa=pa->next;
pc->next=NULL;
}
else{
pb->next=pa;
pb=pb->next;
pa=pa->next;
pb->next=NULL;
}
}
/**************end************/
}
int main()
{
int n;
while(cin>>n)
{
if(n==0) break;
LinkList LA,LB,LC;
CreateList_R(LA,n);
Decompose(LA,LB,LC);
PrintList(LB);
PrintList(LC);
}
return 0;
}
第7关 查找链表中的最大值
#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_R(LinkList &L,int n)
{
L->next=NULL;
LinkList r=new LNode;
r=L;
for(int i=0;i<n;i++)
{
LinkList p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
int MaxData(LinkList L)
{//确定单链表中值最大的结点
/**************begin************/
LinkList max=new LNode,p;
p=L->next;
max->data=p->data;
p=p->next;
while(p)
{
if(p->data > max->data)
max->data=p->data;
p=p->next;
}
return max->data;
/**************end************/
}
int main()
{
int n;
while(cin>>n)
{
if(n==0) break;
LinkList L=new LNode;
CreateList_R(L,n);
cout<<MaxData(L)<<endl;
}
return 0;
}
第8关 链表的逆转
#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_R(LinkList &L,int n)
{
L->next=NULL;
LinkList r=new LNode;
r=L;
for(int i=0;i<n;i++)
{
LinkList p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
void Inverse(LinkList &L)
{//逆置带头结点的单链表L
/**************begin************/
if(L == NULL || L->next == NULL) return;
LinkList p = L->next, q;
L->next = NULL;
while(p ) {
q = p->next;
p->next = L->next;
L->next = p;
p = q;
}
/**************end************/
}
void PrintList(LinkList &L)
{
L=L->next;
while(L){
if(L->next!=NULL) cout<<L->data<<" ";
else cout<<L->data;
L=L->next;
}
cout<<endl;
}
int main()
{
int n;
while(cin>>n)
{
if(n==0) break;
LinkList L=new LNode;
CreateList_R(L,n);
Inverse(L);
PrintList(L);
}
return 0;
}
第9关 删除链表中满足区间值的结点
#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_R(LinkList &L,int n)
{//后插法创建单链表
L=new LNode;
L->next=NULL;
LinkList r=L;
for(int i=0;i<n;i++)
{
LinkList p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
void PrintList(LinkList &L)
{//打印依次输出链表中的数据
L=L->next;
while(L){
if(L->next!=NULL) cout<<L->data<<" ";
else cout<<L->data;
L=L->next;
}
cout<<endl;
}
void DeleteMinMax(LinkList &L,int mink,int maxk)
{//删除链表中满足区间值的结点
/**************begin************/
LinkList p=L->next,pre=L;
while(p)
{
if(p->data>=mink && p->data <= maxk)
{
pre->next=p->next;
p=p->next;
}
else
{
p=p->next;
pre=pre->next;
}
}
/**************end************/
}
int main()
{
int n;
while(cin>>n)
{
if(n==0) break;
LinkList L;
CreateList_R(L,n);
int mink,maxk;
cin>>mink>>maxk;
DeleteMinMax(L,mink,maxk);
PrintList(L);
}
return 0;
}
第10关 双向循环链表中结点的交换
#include<iostream>
using namespace std;
typedef struct DuLNode
{
int data;
struct DuLNode *next;
struct DuLNode *prior;
}DuLNode,*DuLinkList;
void CreateList(DuLinkList &L,int n)
{//建立双向循环链表
L=new DuLNode; //初始化链表L的头结点
L->prior=L;
L->next=L;
DuLinkList r=L; //工作指针r初始化指向头结点
while(n--)
{
DuLinkList p=new DuLNode;
cin>>p->data;
p->next=r->next;
r->next=p;
p->prior=r;
p->next->prior=p;
r=p;
}
}
void Exchange(DuLinkList &L,int loc)
{//双向循环链表中结点的交换
/**************begin************/
DuLinkList p = L;
for (int i = 0; i < loc - 1; i ++) {
if(p!=NULL){
p = p -> next;
}
}
int temp = p->data;
p -> data = p -> next -> data;
p -> next -> data = temp;
/**************end************/
}
void PrintList(DuLinkList &L)
{//依次输出链表中的数据
DuLinkList p=L->next;
while(p->next&&p->next!=L)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<p->data<<endl;
}
int main()
{
int n;
while(cin>>n)
{
if(n==0) break;
DuLinkList L;
CreateList(L,n);
int loc;
cin>>loc;
if(n==1) //链表仅有一个元素时输出其自身
{
cout<<L->next->data<<endl;
continue;
}
Exchange(L,loc);
PrintList(L);
}
return 0;
}
第11关 查找链表中倒数第k个结点
#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_R(LinkList &L,int n)
{//后插法创建单链表
L=new LNode;
L->next=NULL;
LinkList r=L;
for(int i=0;i<n;i++)
{
LinkList p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
void Search_k(LinkList L,int k)
{
/**************begin************/
LinkList p=L->next,q=L->next;
int count=0;
while(count<k)
{
p=p->next;
count++;
}
while(p)
{
p=p->next;
q=q->next;
}
cout<<q->data<<endl;
/**************end************/
}
int main()
{
int n;
while(cin>>n)
{
if(n==0) break;
LinkList L;
CreateList_R(L,n);
int k;
cin>>k;
Search_k(L,k);
}
return 0;
}
第12关 删除链表中绝对值相等的结点
#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_R(LinkList &L,int n)
{//后插法创建单链表
L=new LNode;
L->next=NULL;
LinkList r=L;
for(int i=0;i<n;i++)
{
LinkList p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
void PrintList(LinkList &L)
{//打印依次输出链表中的数据
L=L->next;
while(L){
if(L->next!=NULL) cout<<L->data<<" ";
else cout<<L->data;
L=L->next;
}
cout<<endl;
}
int Abs(int x)
{//绝对值函数
return x>0?x:-x;
}
void DeleteEqualNode(LinkList &L,int n)
{//删除链表中绝对值相等的结点
/**************begin************/
LinkList p=L->next,q=L;
int arr[100];
for(int i=0;i<=99;i++)
{
arr[i]=0;
}
while(p)
{
if(arr[Abs(p->data)]==0)
{
arr[Abs(p->data)]=1;
p=p->next;
q=q->next;
}
else
{
LinkList tem=p;
q->next=p->next;
p=p->next;
delete tem;
}
}
/**************end************/
}
int main()
{
int n;
while(cin>>n)
{
if(n==0) break;
LinkList L;
CreateList_R(L,n);
DeleteEqualNode(L,n);
PrintList(L);
}
return 0;
}
第13关 查找两个单词链表共同后缀的起始结点
#include <iostream>
using namespace std;
typedef struct LNode
{
char data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_R(LinkList &L,int n)
{//后插法创建单链表
L=new LNode;
L->next=NULL;
LinkList r=L;
for(int i=0;i<n;i++)
{
LinkList p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
void FindSuffix(LinkList str1, LinkList str2,int n,int m)
{//查找两个单词链表共同后缀的起始结点
/**************begin************/
LinkList p,q;
if(n>m)
{
p=str1->next;
q=str2->next;
}
else
{
q=str1->next;
p=str2->next;
}
int diff=n-m;
if(diff<0) diff=diff*(-1);
int count=0;
while(count<diff)
{
p=p->next;
count++;
}
while(p&&q)
{
if(p->data==q->data)
{
cout<<p->data<<endl;
break;
}
p=p->next;
q=q->next;
}
/**************end************/
}
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
LinkList str1,str2,p;
CreateList_R(str1,n);
CreateList_R(str2,m);
FindSuffix(str1,str2,n,m);
}
return 0;
}
第15关奇偶链表的分割
#include<iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_R(LinkList &L,int n)
{//后插法创建单链表
L=new LNode;
L->next=NULL;
LinkList r=L;
for(int i=0;i<n;i++)
{
LinkList p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
void Decollate(LinkList L,LinkList L1)
{//奇偶链表的分割
/**************begin************/
LinkList p=L->next;
LinkList q=L;
LinkList p1=L1;
int num=1;
while(p)
{
if(num%2!=0)
{
p1->next=p;
p1=p1->next;
q->next=p->next;
p->next=NULL;
p=q->next;
}
else
{
q=q->next;
p=p->next;
}
num++;
}
p1->next=L->next;
delete L;
/**************end************/
}
void PrintList(LinkList &L)
{//依次输出链表中的数据
LinkList p=L->next;
while(p)
{
if(p->next!=NULL) cout<<p->data<<" ";
else cout<<p->data;
p=p->next;
}
cout<<endl;
}
int main()
{
int n;
while(cin>>n)
{
if(n==0) break;
LinkList L=new LNode;
CreateList_R(L,n);
LinkList L1=new LNode; //申请新链表L1
L1->next=NULL;
Decollate(L,L1); //奇偶链表的分割
PrintList(L1);
}
return 0;
}