线性表
线性表是一种动态数据结构,它的表长可以变化,并允许在任何位置插入和删除元素。
线性表的顺序实现结构定义:
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;
}