主题:一道小题把我考倒。。
			 jq2008
				 [专家分:0]  发布于 2006-09-08 16:44:00
 jq2008
				 [专家分:0]  发布于 2006-09-08 16:44:00							
			试用顺序表作为存储结构,实现线性表(a0,a1,…,an-1)就地逆置的操作,所谓"就地"指辅助空间应为O(1)。
						
					 
		
			
回复列表 (共8个回复)
		
								
				沙发
				
					 linyuetian [专家分:310]  发布于 2006-09-09 10:37:00
linyuetian [专家分:310]  发布于 2006-09-09 10:37:00				
				可以定义一个指针,指最后面的结点,让最后面的结点的next指向倒数第二个,倒数第二个的next指向倒数第三个,以此类推;
typedef struct link
{
   int data;
   struct link next;
}linklist;
linklist *ppt,*ppt2;
ppt=head;        //ppt指向队头
ppt2=head->next; //ppt2指向下一个结点
ppt->next=NULL;  //头结点的next变为NULL,变为队尾
while(ppt2!=NULL)
{
  ppt2->next=ppt;
  ppt2=ppt->next;
  ppt=ppt->next;
}
head=ppt; //最后一个结点为头结点
//这里只是伪代码,还要考虑有没有头结点等等
							 
						
				板凳
				
					 leolhc [专家分:430]  发布于 2006-09-10 16:38:00
leolhc [专家分:430]  发布于 2006-09-10 16:38:00				
				人家要的是顺序表的,楼上的给了链表的解答,显然不符合题意。
因为顺序表是随机存取的存储结构的,所以其实只要 a[i]←→a[n-1-i]就可以了。
							 
						
				3 楼
				
					 蓝色秋雨 [专家分:0]  发布于 2006-09-10 22:17:00
蓝色秋雨 [专家分:0]  发布于 2006-09-10 22:17:00				
				typedef struct {
   int *elem;
   int length;
}SqList;
 
void reverse(SqList &L)
{ 
   for (i = 0,j = L.length; i < j; ++i,--j) { temp = L.elem[i]; L.elm[i]=L.elm[j];L.elem[j]=temp;}                                       
}
							 
						
				4 楼
				
					 蓝色秋雨 [专家分:0]  发布于 2006-09-10 22:19:00
蓝色秋雨 [专家分:0]  发布于 2006-09-10 22:19:00				
				typedef struct {
   int *elem;
   int length;
}SqList;
 
void reverse(SqList &L)
{ 
   for (i = 0,j = L.length - 1; i < j; ++i,--j) {
       temp = L.elem[i]; 
       L.elm[i]=L.elm[j];
       L.elem[j]=temp;
   }                                       
}
							 
						
				5 楼
				
					 chenyinjing [专家分:150]  发布于 2006-09-15 15:04:00
chenyinjing [专家分:150]  发布于 2006-09-15 15:04:00				
				在i<=n/2的时候把a[i] 和a[n-i-1]交换!
							 
						
				6 楼
				
					 563409036 [专家分:0]  发布于 2007-10-27 11:01:00
563409036 [专家分:0]  发布于 2007-10-27 11:01:00				
				额,什么意思啊?????????????????????这些真难懂!!!
							 
						
				7 楼
				
					 ghl116 [专家分:0]  发布于 2007-10-27 23:12:00
ghl116 [专家分:0]  发布于 2007-10-27 23:12:00				
				
很简单啊!!!!!!只要申明三个结点,然后用循环就可以了!!!!!!!!
void linklist::reverse(){
    int array[1000];
    linklist*current;
    if(first==NULL||first->link==NULL){
        cout<<"不可以反转链表;"<<endl;
        return ;
    }
    current=first;
    int i=0;
    for(;current!=NULL;i++){
        array[i]=current->info;
        current=current->link;
    }
    current=first;
    i=i-1;
    for(;current!=NULL;i--){
        current->info=array[i];
        current=current->link;
    }
}
然后就OK了!!!!!!!!!
真的,我试过!!!!!!!!!!!!!
							 
						
				8 楼
				
					 bpttc [专家分:8790]  发布于 2007-10-30 14:20:00
bpttc [专家分:8790]  发布于 2007-10-30 14:20:00				
				首尾向中间依次做两两交换
							 
									
			
我来回复