在上一篇计算机图形学/扫描线填充算法中,由于每一条扫描线要对应一个链表,所以使用到了指针数组,在对活性边表排序时涉及到链表的排序,这些知识都忘了,现在捡起来。
指针数组
用于存储指针的数组,也就是每个元素都是指针。 int * a[5]; //数组中有5个指针
[ ]的优先级高于*优先级,我认为可以看作int* 是一种类型,定义一个int * 类型的数组,就是指针数组了。
数组指针
指向数组的指针,就是一个指针。 int (*a)[5]; //一个指向有5个元素的数组的指针
int b[5];
a=&b;
经过测试发现,虽然b是数组的首地址,但a=b这种写法编译不通过。
利用a输出b的内容:cout<<(*a)[3];
链表的构建
我的方法是头指针指向的头节点不使用, 将生成的新结点插入到表头。
typedef struct node
{
int data;
struct node *next;
}Node,*pNode;
pNode L=new Node; //头指针
L->next=NULL;
//插入到表头
void createLink1( )
{
for(int i=1;i<5;i++)
{
pNode p=new Node; //临时节点
p->data=i;
p->next=L->next;
L->next=p; //不使用头节点
}
}
也可以插入表尾
pNode L=new Node;
L->next=NULL;
pNode s=L;
void createLink2( )
{
for(int i=1;i<5;i++)
{
pNode p=new Node; //临时节点
p->data=i;
p->next=NULL;
s->next=p;
s=s->next;
}
}
链表的排序
想过使用冒泡排序法,但好像使用的指针很多,没有实现。这里使用简单选择排序算法,在数组排序(从小到大)中,选择排序法每次找到元素中的最小值,放到数组的前面,在链表中,将元素插入到表头比较简单,所以每次找到最大元素,插入到表头,这样最大的元素在表尾,最小元素在表头。
void sortLink(pNode p)//pNode是头指针
{
pNode p0=p;
while(p0->next)
{
pNode pmax=p0;
pNode p1=p0;
pNode pi=NULL;
while(p1->next)
{
if(p1->next->data > pmax->next->data)
pmax=p1;
p1=p1->next;
}
pi=pmax->next; //pmax->next中的元素是当前最大元素
pmax->next=pi->next;//取出节点pi
//插入到表头
pi->next=p->next;
p->next=pi;
if(p0==p)
p0=pi;//p0始终指向元素最大的节点,
//p0->next==NULL表示最大节点已经到表尾
}
}