线性表
顺序表即线性表的顺序存储,它是用一组地址连续的存储单元依次存储顺序表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
线性表的定义和基本操作
- 定义
 - 基本操作
 
线性表的顺序表示
- 顺序表的定义
 - 顺序表的操作
 
线性表的链式表示
- 
单链表的定义
 - 
单链表的操作
 - 
双链表的操作
 - 
循环链表的操作
 - 
静态链表的操作
 - 
逆置问题
 - 
逻辑顺序与物理顺序相同 ;
 - 
随机访问 ;
 - 
每个结点只存储数据元素;
 - 
插入、删除操作需要移动大量元素
 
c语言描述(静态分配)

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define MaxSize 50
typedef struct
{
	int data[MaxSize];
	int length;
}SqList;
SqList* InitList();		//构造一个顺序表
int Length(SqList *L);		//顺序表长度
int LocateElem(SqList *L, int e);		//返回L中元素e的位置
int GetElem(SqList *L, int i);		//返回L中第i位置元素值
bool ListInsert(SqList *L, int i, int e);		//在L中第i个位置插入元素e
bool ListDelete(SqList *L, int i);		//删除L中第i个位置上元素 
void PrintList(SqList *L);		//输出L所有元素
void DestroyList(SqList *L);		//释放L所占空间 
int main()		//测试函数是否可行
{
	SqList *L;		//指针较为方便
	L = InitList();
	int i;
	for(i=0;i<55;i+=11)
	{
		ListInsert(L, 1, 99-i);
	}
	printf("当前表的长度为%d\n",Length(L));
	PrintList(L);
	ListDelete(L, 2);
	PrintList(L);
	int e = L->data[2];
	printf("\n%d的位置是%d",e,LocateElem(L,e));
	printf("\n第%d个元素为%d\n",2,GetElem(L,2)); 
	DestroyList(L);
	printf("当前表的长度为%d\n",Length(L));
	PrintList(L); 
	return 0;
}
SqList* InitList()		//返回指向SqList类型的指针
{
	SqList *L;
	L = (SqList *)(malloc(sizeof(SqList)));		//申请空间并返回指针赋值
	L->length = 0;
	return L;
};
int Length(SqList *L)
{
	return L->length;
}
int LocateElem(SqList *L, int e)	//平均比较次数为(n+1)/2
{
	int i;
	for(i=0; i<L->length; i++)
	{
		if(L->data[i] == e)	
			return i+1;
	}
	return 0;
}
int GetElem(SqList *L, int i)		//O(1)
{
	return L->data[i-1];
}
bool ListInsert(SqList *L, int i, int e)		//平均移动次数为n/2
{
	int j;
	if(i<1 || i>L->length+1){
		printf("插入位置不合法\n");
		return false;
	}
	if(L->length >= MaxSize){
		printf("存储空间已满\n");
		return false;
	}
	for(j=L->length; j>=i; j--)
	{
		L->data[j] = L->data[j-1];		//第i个元素及后面后移一个位置
	}
	L->data[i-1] = e;
	L->length++;
	printf("%d已被插入\n",e);
	return true;
}
bool ListDelete(SqList *L, int i)		//平均删除次数为(n-1)/2
{
	int j;
	if(i<1 || i>L->length){
		printf("删除位置不合法\n");
		return false;
	}
	printf("\n%d已被删除\n",L->data[i-1]);
	for(j=i; j<=L->length; j++)
	{
		L->data[j-1] = L->data[j];		//第i+1个元素及后面前移一个位置
	}
	L->length--;
	return true;
}
void PrintList(SqList *L)
{
	int i;
	printf("当前表中元素为 "); 
	for(i=0; i<L->length; i++)
		printf("%d ",L->data[i]);
}
void DestroyList(SqList *L)
{
	printf("表已清空\n");
	L->length = 0;
	free(L);	//释放L所指空间内存
} 
                  
                  
                  
                  
                            
本文介绍了线性表的顺序存储结构——顺序表,包括其定义、基本操作,并通过C语言展示了顺序表的动态和静态分配实现。顺序表允许随机访问但插入和删除操作可能涉及大量元素移动。此外,还涵盖了单链表、双链表、循环链表和静态链表的基本概念和操作。
          
      
          
                
                
                
                
              
                
                
                
                
                
              
                
                
              
            
                  
					2601
					
被折叠的  条评论
		 为什么被折叠?
		 
		 
		
    
  
    
  
            


            