1. 顺序表:
要将该表逆置,可以将表中的开始结点与终端结点互换,第二个结点与倒数第二个结点互换,如此反复,就可将整个表逆置了。算法如下:
// 表结构定义同上
void ReverseList( Seqlist *L)
{
Datatype t ; //设置临时空间用于存放data
int i;
for ( i=0 ; i < L->length/2 ; i++)
{ t = L->data[i];//交换数据
L -> data[ i ] = L -> data[ L -> length - 1 - i ] ;
L -> data[ L -> length - 1 - i ] = t ;
}
}
2. 链表:
也是可以用交换数据的方式来达到逆置的目的,但是由于是单链表,数据的存取不是随机的,因此算法效率太低,我们可以利用指针的指向转换来达到表逆置的目的。算法是这样的:
// 结构定义略
LinkList ReverseList( LinkList head )
{
// 将head 所指的单链表逆置
ListNode *p ,*q ;//设置两个临时指针变量
if( head->next && head->next->next)
{
//当链表不是空表或单结点时
p=head->next;
q=p->next;
p -> next=NULL;//将开始结点变成终端结点
while (q)
{//每次循环将后一个结点变成开始结点
p=q;
q=q->next ;
p->next = head-> next ;
head->next = p;
}
return head;
}
return head;//如是空表或单结点表,直接返回head
}
楼上的代码胡弄洋鬼子呢,也没实现逆置,只是逆向输出了一下!
很久没碰过程序了。。。
main()
{
int n,i;
int a[100];
printf("请输入线性表的长度\n");
scanf("%d",&n);
printf("请输入线性表的元素\n");
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
printf("线性表的各元素为:%d, ",a[i]);
printf("\n");
getch();
for(i=n;i>0;i--)
printf("逆置后的线性表的各元素为:%d,",a[i]);
printf("\n");
getch();
}
什么呀,不就是逆序又输出一遍嘛,忽悠谁呢