题目描述:
线性表(a1,a2,a3,…,an)中元素递增有序且按顺序存储于计算机内。要求设计一算法完成:
(1) 用最少时间在表中查找数值为x的元素。
(2) 若找到将其与后继元素位置相交换。
(3) 若找不到将其插入表中并使表中元素仍递增有序。
输入:
输入:x=3
输入长度:9
输入数据:2 3 5 7 12 15 17 23 45
输出:
相同元素为:3
交换后的链表为:2 5 3 7 12 15 17 23 45
样例输入:
4
9
2 3 5 7 12 15 17 23 45
样例输出:
no
2 3 4 5 7 12 15 17 23 45
实现代码:
#include <cstdio>
#include <cstdlib>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
bool Insert_or_Exchange(LinkList &L,int x){
LinkList p1;
LinkList p2=L;
if(L->next!=NULL){
p1=L->next;
}else{
LinkList q=(LinkList)malloc(sizeof(LNode));
q->data=x;
q->next=NULL;
L->next=q;
return 0;
}
while(p1){
if(p1->data>=x){
break;
}
p1=p1->next;
p2=p2->next;
}
if(p1){
if(p1->next!=NULL&&p1->data==x){
LinkList temp=p1->next;
p2->next=p1->next;
p1->next=temp->next;
temp->next=p1;
return 1;
}
if(p1->data>x){
LinkList q=(LinkList)malloc(sizeof(LNode));
q->data=x;
p2->next=q;
q->next=p1;
return 0;
}
}else{
LinkList q=(LinkList)malloc(sizeof(LNode));
q->data=x;
q->next=NULL;
p1->next=q;
return 0;
}
}
void PrintList_L(LinkList &L){
LinkList p;
p=L->next;
int flag=0;
while(p){
if(flag){
printf(" %d",p->data);
}else{
printf("%d",p->data);
flag=1;
}
p=p->next;
}
printf("\n");
}
int main()
{
int x;
int len;
while(scanf("%d",&x)!=EOF){
LinkList L1=(LinkList)malloc(sizeof(LNode));
L1->next=NULL;
int data;
LinkList q=L1;
scanf("%d",&len);
for(int i=0;i<len;i++){
scanf("%d",&data);
LinkList p=(LinkList)malloc(sizeof(LNode));
p->data=data;
p->next=NULL;
q->next=p;
q=q->next;
}
if(Insert_or_Exchange(L1,x)){
printf("%d\n",x);
PrintList_L(L1);
}else{
printf("no\n");
PrintList_L(L1);
}
}
return 0;
}