数据结构---线性表

                                    线性表

学习
不想学习
还是学习吧!!!
早起很痛苦!!!
学习不能使人快乐!!!

线性表内容还是算少的!!两天整理完了!!!
在这里插入图片描述


一.线性表


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; 
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值