指针数组和数组指针/链表的构建和排序

在上一篇计算机图形学/扫描线填充算法中,由于每一条扫描线要对应一个链表,所以使用到了指针数组,在对活性边表排序时涉及到链表的排序,这些知识都忘了,现在捡起来。

指针数组

用于存储指针的数组,也就是每个元素都是指针。
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表示最大节点已经到表尾
    }
} 
posted @ 2015-12-01 14:33  fanf_zhang  阅读(427)  评论(0编辑  收藏  举报