- 6 -
分析:
可以用交换数据的方式来达到逆置的目的。但是由于是单链表,数据的存取不是随机的,因此算法效率太低。可以利用指
针改指来达到表逆置的目的。具体情况入下:
(1)当链表为空表或只有一个结点时,该链表的逆置链表与原表相同。
(2)当链表含 2 个以上结点时,可将该链表处理成只含第一结点的带头结点链表和一个无头结点的包含该链表剩余结点的链
表。然后,将该无头结点链表中的所有结点顺着链表指针,由前往后将每个结点依次从无头结点链表中摘下,作为第一个结点
插入到带头结点链表中。这样就可以得到逆置的链表。算法是这样的:
结点结构定义如下:
typedef char DataType; //假设结点的数据域类型的字符
typedef struct node{ //结点类型定义
DataType data; //结点的数据域
struct node *next;//结点的指针域
}ListNode;
typedef ListNode *LinkList;
ListNode *p;
LinkList head;
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
}
2.9 设顺序表 L 是一个递增有序表,试写一算法,将 x 插入 L 中,并使 L 仍是一个有序表。
因已知顺序表 L 是递增有序表,所以只要从顺序表终端结点(设为 i 位置元素)开始向前寻找到第一个小于或等于 x 的元
素位置 i 后插入该位置即可。
在寻找过程中,由于大于 x 的元素都应放在 x 之后,所以可边寻找,边后移元素,当找到第一个小于或等于 x 的元素位置
i 时,该位置也空出来了。
算法如下:
//顺序表存储结构如题 2.7
void InsertIncreaseList( Seqlist *L , Datatype x )
{
int i;
if ( L->length>=ListSize)