线性表
学习
不想学习
还是学习吧!!!
早起很痛苦!!!
学习不能使人快乐!!!
线性表内容还是算少的!!两天整理完了!!!
一.线性表
1.线性表的顺序存储
typedef struct{
ElemType data[MaxSize];//顺序表的元素
int length;//顺序表的当前长度
}SqList;//顺序表的类型定义
#define InitSize 100 //表长度的初始定义
typedef struct{
ElemType *data;//指示动态分配数组的指针
int MaxSize,length;//数组的最大容量和当前个数
}SeqList;//动态分配数组顺序表的类型定义
2.插入操作(在第i(1<=i<=L.length+1)个位置插入新元素e
bool ListInsert(SqList &L,int i,ElemType e)
{
//将元素e插入到顺序表L中第i个位置
if(i<1 || i>L.length+1) //判断i的范围是否有效
return false;
if(L.length>=MaxSize) //当前存储空间已满,不能插入
return false;
for(int j=L.length;j>=i;j--) //将第i个元素及以后的元素后移
L.data[j]=L.data[j-1];
L.data[i-1]=e;//在位置i处放入e
L.length++;
return true;
}
3.删除操作(删除顺序表中第i(1<=i<=L.length+1)个位置的元素
bool ListDelete(SqList &L,int i,Elemtype &e)
{
//实现删除顺序表L中第i个位置的元素
if(i<1 || i>L.length) //判断i的范围是否有效
return false;
e=L.data[i-1];//被删除的元素复制给e
for(int j=0;j<L.length;j++) //将第i个位置后的元素前移
L.data[j-1]=L.data[j];
L.length--;//线性表长度减1
return true;
}
4.按值查找
int LocateElem(SqList L,ElemType e)
{
//查找顺序表中值为e的元素,查找成功,返回位序
int i;
for(i=0;i<L.length;i++)
if(L.data[i]==e)
return i-1;//下标为i的元素值等于e,返回其位序i+1
return 0;
}
二.单链表
1.单链表中结点类型
typedef struct LNode{ //定义单链表结点类型
ElemType data;//数据域
struct LNode *next;//指针域
}LNode,*LinkList;
2.建立单链表
//头插法建立单链表(读入的数据的顺序与生成的链表中的元素的顺序是相反的)
//每个结点插入的时间为O(1),设单链表长为n,则总时间复杂度为O(n)
LinkList List_HeadInsert(LinkList &L)
{
LNode *s;int x;//创建头结点
L=(LinkList)malloc(sizeof(LNode));//创建头结点
L->next=NULL;//初始为空链表
scanf("%d",&x);//输入结点的值
while(x!=9999)
{
s=(LNode*)malloc(sizeof(LNode));//创建新结点
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);//将新结点插入表中,L为头指针
}
return L;
}
//尾插法,将新结点插入到当前链表的表尾,增加一个尾指针,使其始终指向当前链表的尾结点
LinkList List_TailInsert(LinkList &L)
{
//从表头到表尾正向建立单链表L,每次均在表尾插入元素
int x;
L=(LinkList)malloc(sizeof(LNode));
LNode *s,*r=L;//r为表尾指针
scanf("%d",&x);//输入结点的值
while(x!=9999){
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;//r指向新的表尾结点
scanf("%d",&x);
}
r->next=NULL;//尾结点指针置空
return L;
}
3.按序号查找结点值
LNode *GetElem(LinkList L,int i){
//取出单链表L(带头结点)中第i个位置的结点指针
int j=1;//计数,初始为1
LNode *p=L->next;//头结点指针赋给p
if(i==0)
return L;//若i等于0,则返回头结点
if(i<1)
return NULL;//若i无效,则返回NULL
while(p&&j<i)
{
//从第1个结点开始找,查找第i个结点
p=p->next;
j++;
}
return p;//返回第i个结点的指针,如果i大于表长,p=NULL,直接返回p即可
}
4.按值查找表结点
LNode *LocateElem(LinkList L,ElemType e)
{
//查找单链表L(带头结点)中数据域值等于e的结点指针,否则返回NULL
LNode *p=L->next;
while(p!=NULL&&p->data!=e) //从第一个结点开始查找data域为e的结点
p=p->next;
return p;
}