|
发表于 2013-7-20 17:32:56
|
显示全部楼层
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
const int MAXSIZE=10000;
struct node
{
int data,pre,nxt;//节点的值,前驱,后缀
}a[MAXSIZE];
int cmp(const void*a,const void*b)
{
return (*(node *)a).data>(*(node *)b).data;
}
int n; //总节点数
bool find=false;
int search(int x)
{
int low=0,high=n-1,mid;
if(a[low].data==x)
{
find=true;
return low;
}
if(a[high].data==x)
{
find=true;
return high;
}
while(low<=high)
{
mid=low+((high-low)/2);
if(a[mid].data==x)
{
find=true;
return mid;
}
if(a[mid].data>x)
high=mid-1;
else
low=mid+1;
}
if(low>high)
return low-1;
}
int main()
{
printf("请输入数据的个数:");
scanf("%d",&n);
printf("请输入数据:\n");
for(int i=0;i<n;i++)
scanf("%d",&a[i].data);
qsort(a,n,sizeof(node),cmp);//构造有序线性表
for(int i=0;i<n;i++)
printf("%d ",a[i].data);
printf("\n");
for(int i=0;i<n;i++)//建立双向链表
{
a[i].pre=i-1;
a[i].nxt=i+1;
}
a[n-1].nxt=-1;
int x,head=0;
printf("请输入待查找元素:");
scanf("%d",&x);//待查找的元素
int pos=search(x); //二分查找,如果找到则find为true,否则为false
if(find)
{
if(pos!=n-1) //与后继交换,此处略麻烦
{
int before=a[pos].pre,behind=a[pos+1].nxt;
a[pos].pre=pos+1;
a[pos].nxt=behind;
a[pos+1].pre=before;
a[pos+1].nxt=pos;
a[before].nxt=pos+1;
a[behind].pre=pos;
if(pos==0)
head=1;
}
}
else
{
a[n].data=x; //没找到,假设这个新节点序号为n
if(pos!=-1)
{
a[pos].nxt=n;
a[n].pre=-1;
}
else
{
head=n;
a[n].pre=pos;
}
a[pos+1].pre=n;
if(pos!=n-1)
a[n].nxt=pos+1;
else
a[n].nxt=-1;
n++;
}
printf("操作后的数据:\n");
int i=head;
while(i!=-1)
{
printf("%d ",a[i].data);
i=a[i].nxt;
}
printf("\n");
return 0;
} |
评分
-
查看全部评分
|