2.1 线性表的定义和基本操作
2.2.1顺序表的定义
顺序表的实现-静态分配
暂略
顺序表的实现-动态分配
使用malloc和free函数需要加:
#include <stdlib.h>
#define InitSize 10//默认的最大长度
typedef struct
{
int *data;//指示动态分配数组的指针
int MaxSize;//顺序表的最大容量
int length;//顺序表的当前长度
}SeqList;
void InitList(SeqList &L){
//用malloc函数申请一片连续的存储空间
L.data = (int *)malloc(InitSize*sizeof(int));
L.length = 0;
L.MaxSize = InitSize;
}
//增加动态数组的长度
void IncreaseSize(SeqList &L, int len){
int *p = L.data;
L.data = (int *)malloc((L.MaxSize+len)*sizeof(int));
for(int i = 0;i <L.length;i++){
L.data[i] = p[i];//将数据复制到新的区域
}
L.MaxSize = L.MaxSize + len;//顺序表最大长度增加len
free(p);//释放原来的内存空间
}
int main(){
SeqList L;//声明一个顺序表
InitList(L);//初始化顺序表
//插入几个元素
IncreaseSize(L,5);
return 0;
}
2.2.2_1顺序表的插入删除
插入
删除
2.2.2_2顺序表的查找
静态按位查找
//顺序表的按位查找
GetElem(L,i)
#define MaxSize 10;//定义最大长度
typedef struct {
int data[MaxSize];//用静态的数组存放数据元素
int length;//顺序表的当前长度
}SqList;
int GetElem(SqList L,int i){
//也可先判断一下i违规没
return L.data[i-1];
}
动态按位查找
//顺序表的按位查找
GetElem(L,i)
#define InitSize 10;//定义最大长度
typedef struct {
//int data[MaxSize];//用静态的数组存放数据元素
ElemType *data;//指示动态分配数组的指针
int MaxSize;
int length;//顺序表的当前长度
}SqList;
ElemType GetElem(SqList L,int i){
//也可先判断一下i违规没
return L.data[i-1];//和静态分配一样
}
时间复杂度O(1)
静态按值查找
动态按值查找
举栗子:
注意C语言中判断两个结构体是否相等不能直接用==:
(C++可尝试重载这个运算符)
时间复杂度O(n)
总结
2.3.1单链表的定义
//关于stuct的简便写法:
struct LNode{
ElemType data;
struct LNode *next;
};
typedef struct LNode LNode;
typedef struct LNode *LinkList;
//上述语句可以表示为:
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
关于LNode * 和 LinkList:
总结
2.3.2_1单链表的插入和删除
//按位序插入(带头结点)
//在第i个位置插入元素e
bool ListInsert(LinkList &L,int i,ElemType e){
if(i < 1)
return false;
LNode *p;
int j = 0;
p = L;//L指向头节点,头节点是第0个节点,不存数据
while(p != NULL && j < i-1){
//循环找到第i-1个节点
p = p->next;
j++;
}
if(p == NULL)//i值不合法
return false;
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
//指定节点的前插操作:在p节点之前插入元素e
//思想:先插在后面,再换数据
bool InsertPriorNode(LNode *p,ElemType e){
if(p == NULL)
return false;
LNode *s = (LNode *)malloc(sizeof(LNode));
if(s == NULL)//内存分配失败
return false;
s->next = p->next;
p->next = s;
s->data = p->data;
p->data = e;
return true;
}