《数据结构与算法分析(c语言版)》学习笔记②链表的应用与链表的游标实现

1、多项式的ADT
类型声明
typedef struct NODE
{
	int coeddicient;//系数
	int Exponent;//次数
	NODE* NEXT
}NODE;

2、基数排序
从最低位开始桶式排序,一直到最高位结束,按序输出。时间复杂度为O(P(N+B))(N为元素个数,B为桶数,P为排序的趟数)。

桶式排序的时间复杂度为O(N)。
3链表的游标实现
//链表声明
typedef struct NODE
{
	ElementType Element;
	int next;
 } NODE
空间的建立
NODE arry[n]//n为需要的struct NODE的个数

游标型链表空间的建立
int alloc
{
  int p;
  p=arry[0].next;
  arry[0].next=arry[p].next;
  return p;//创建一个p处的链表
}

游标型链表的空间释放
void free(p)
{
  arry[p].next=arry[0].next;
  arry[0].next=p;
}/*将p插入以0为表头的初始链表。游标型的构造方法为一个以0为表头的初始链表和多个已经链接好的链表(0永远都不是构造的链表的单元)。从0后拿走单或者从0将单元放入0后。最后链表的结尾返回到0(不是null)*/
测试一个表是否为空表
int isempty(list L)//L为表头的游标
{
  return arr[L].next==0;
}
测试p是不是链表的结尾
int islast(int p)
{
  return arry[p].next==0;
}
find例程
find(ElementType x,list T)
{
	int p;
	p=arry[T].next;
	while(arr[p].element==x&&arry[p].next==0)
	p=arry[p].next;
	return p;
}

删除例程

delet(element x,list L) 
{
	int p,temp;
	p=findprecious(x,l);//找到被删除的单元的前驱元,找不到返回最后一个单元的地址 
	if( !islast(p,l) )
	{
		temp=arry[p].next;
		arry[p].next=arry[temp].next;
		free(temp);//把被删除项放到0后面。 
	}
}
插入例程
insert(elementType x,int p)
{
	int temp;
	temp=alloc();
	if(temp==0)printf("out of space");
	else
	{
		arry[temp].element=x;
		arry[temp].next=arry[p].next;
		arry[p].next=temp;
	}
} //p为需要插入的地方的前驱元。


你可能感兴趣的:(Learning,Notes)