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

来源:互联网 发布:天赐系统安装软件 编辑:程序博客网 时间:2024/05/21 15:42

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

指针数组

用于存储指针的数组,也就是每个元素都是指针。
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表示最大节点已经到表尾    }} 
0 0