线性表

线性表

线性表是一种动态数据结构,它的表长可以变化,并允许在任何位置插入和删除元素。

线性表的顺序实现结构定义:

typedef struct list
{
	int Size,MaxList;//线性表长度、允许最大长度
	T Element[MaxSize];//存放线性表中数据
}List;

线性顺序表的插入:

若要在位置pos处插入元素值为x的函数,当前表长为n。则必须将下标位于[pos,n-1]中的元素向后移一个位置,这种移动必须从最后一个元素开始。表长加一。
函数返回true,如果顺序表已满,或者pos若在[0,n]外,则返回false。
在位置i处每插入一个元素就饿需要移动n-i个元素,现0<=i<=n,则共有n+1 个可插元素的位置。设在各位置插入元素的概率相等为1/n+1,则平均情况下插一个元素需要移动
元素的个数为:

线性顺序表的删除:

若要删除在位置pos处的元素,当前表长为n。则必须将下标位于[pos,n-1]中的元素向前移一个位置,这种移动必须从pos+1 位置开始。表长减一。
函数返回true,如果顺序比哦啊为空,或者删除元素的位置落在[0,n-1]之外,则返回false。
同插入,可计算出在顺序表中删除一个元素要移动元素的个数为:

线性表的顺序实现:

void CreateList(List* list,int maxsize)
{
	list->Size = 0;
	list->MaxList = maxsize;
}

BOOL IsEmpty(List list)
{
	return list.size == 0;
}

BOOL IsFull(List list)
{
	return list.size == list.MaxList;
}

void Clear(List* list)
{
	list->Size;
}

BOOL Insert(List* list,int pos,T x)
{
	int i;
	if(IsFull(*list))
	{
		printf("Overflow\n");
		return FALSE;
	}
	if(pos<0||pos>list->Size)
	{
		printf("Out of Bounds\n");
		return FALSE;
	}
	for(i=list->Size;i>=pos;i--)
		list->Element[i+1] = list->Element[i];
	list->Element[pos] = x;
	list->Size++;
	return TRUE;
}

BOOL Remove(List* list,int pos,T* x)
{
	int i;
	if(IsEmpty(*list))
	{
		printf("Underflow\n");
		return FALSE;
	}
	if(pos<0||pos>list->size-1)
	{
		printf("OutBounds\n");
		return FALSE;
	}
	*x = list->Element[pos];
	for(i=pos+1;i<list->Size;i++)
		list->Element[i-1] = list->Element[i];
	list-Size--;
	return TRUE;
}

 

线性表的链接表示:

 

采用单链表实现线性表,其结构定义:

typedef struct node
{
	T Element;
	struct node* Link;
}Node;

typedef struct list{
	Node* first;
	int Size;
}List;

辅助函数set_pos,返回指向单链表pos处的结点指针。
其函数实现:

Node* set_pos(List list, int pos)
{
	int i;
	Node *q = list.first;
	for (i = 0; i < pos; i++)
		q = q->Link;
	return q;
}


插入函数:

BOOL Insert(List* list,int pos,T x)
{
	Node* p,*q = list->first;//q为临时结点
	if(pos<0||pos>list->Size)
	{
		printf("Out of Bounds\n");
		return FALSE;
	}
	p->NewNode2(x);//创建结点
	if(pos == 0)//如果为空队列
	{
		p->Link = list->first;//则插在队首
		list->First = p;//新的队首指针
	}
	else
	{				
		q = set_pos(*list,pos-1);//找出需要插入的前一个结点
		p->link = q->link;
		q->link = p;
	}
	list->Size++;//队列长度加一
	return TRUE;
}

删除函数:

BOOL Remove(List* list,int pos)
{
	Node* q,*p = list->first;//p为临时结点
	if(IsEmpty(*list))
	{
		printf("Underflow\n");
		return false;
	}
	if(pos<0||pos>=pos->list.Size)
	{
		printf("OutBounds\n");
		return FALSE;
	}
	if(pos==0)
		list->first = p->Link;
	else
	{
		q = set_pos(*list,pos-1);
		p = q->Link;
		q->Link = p->Link;
	}
	free(p);
	list->Size--;
	return TRUE;
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值