@数据结构(考研向)
学习目标:
线性表
学习内容:
1:线性表的结构定义(单链表的结点定义,双链表的结点定义)
2:线性表的查找(顺序查找,数据查找)
3:建立链表(头插法 尾插法)
学习时间:
2021.3.30
11:30-12:30
21:30-22:10
学习产出:
*基本操作
初始化(顺序表);
void initList(Sqlist& L) //将顺序表初始化
{
L.length = 0;
}
顺序表结构定义:
#define maxSize 100 //定义一个整数类型maxSize,值为100
typedef struct //顺序表结构定义
{
int data[maxSize]; //存放元素的数组
int length; //定义长度
}Sqlist;
单链表结点定义:
typedef struct LNode //单链表结点定义
{
int data;
struct LNode *next;
}LNode;
双链表结点定义:
typedef struct DLNode //双链表结点定义
{
int data;
struct DLNode* prior;//指向前驱结点
struct DLNode* next; //指向后驱结点
}DLNode;
顺序表的操作
例题:
//eg1:插入一个元素,并保持原有排序(两步:1 查找 2插入)
int findElem(Sqlist L, int x)//找到这个元素
{
int i;
for (i = 0; i < L.length; ++i)
{
return i;//从0到i{max}依次查找
}
return i;
顺序表的插入:
void insertElem(Sqlist &L,int x)//插入函数
{
int p, i;
p = findElem(L, x); //查找函数 ,如上
for (i = L.length - 1; i >= p; --i) //将顺序表后面的数字依次后移一位
L. data[i + 1] = L.data[i];
L.data[p] = x; //将x放到p位置上
++(L.length); //顺序表的表长加1
按照data来查找:
//按照元素大小(值)来查找: 查找一个值等于e的元素 输出位置
int findElem(Sqlist L, int e) //找到这个元素
{
int i;
for (i = 0; i < L.length; ++i) //i依次加一,判断值得大小是否相等
if (e == L.data[i])
return i;
return -1;
}
单链表的操作
例题:
//eg1 将a和b两个链表和成一个链表c (p27 2.2.3)
void merge(LNode* A, LNode* B, LNode*& C)
{
LNode* p = A->next; //p来跟踪a的最小值
LNode* q = B->next; //q来跟踪b的最小值
LNode* r; //指向c的终端
C = A; //用a来做c的头结点 也可以c=b;
C->next = NULL; //可以忽略,前提是if语句必须执行一个
free(B);
r= C;
while (p != NULL && q != NULL) //当p和q都不空的时候,较小的变成c的结点插入c
{
if (p->data <= q->data)
{
r->next = p; p = p->next;
r = r->next;
}
else
{
r->next =q; q = q->next;
r = r->next;
}
}
r->next = NULL;
if (p != NULL) //将a的剩余结点插入c
{
r ->next = p;
}
if (q != NULL) //将b的剩余结点插入c
{
r ->next = q;
}
}
单链表的建立(尾插法):
//尾插法建立单链表
void createListR(LNode *& C, int a[], int n) //要改变数据 *&c
{
LNode * s, * r; //s指向新申请的结点 r指向终端的结点
int i;
C = (LNode*)malloc(sizeof(LNode)); //申请c的头结点空间
C->next = NULL;
r = C; //将r指向结点 现在链表只有一个头结点
for (i = 0; i < n; ++i)
{
s = (LNode*)malloc(sizeof(LNode)); //依次申请结点空间
s->data = a[i];
r->next = s;
r = r->next;
}
r->next = NULL;
}
头插法:
//头插法建立单链表
void createListF(LNode*& C, int a[], int n)
{
LNode* s, * r;
int i;
C = (LNode*)malloc(sizeof(LNode));
C->next = NULL;
r = C;
for (i = 0; i < n; ++i)
{
s = (LNode*)malloc(sizeof(LNode));
s->data = a[i];
s->next = C->next; // s指向c的开始结点
C->next = s; // 头结点指针next指向s
}
r->next = NULL;
}
例题:
//eg2 p31 例2-4
//链表中的结点查找 从表头到表尾 并删除这个结点
int findAndDelete(LNode* C, int x)
{
LNode* p, * q;
p = C;
//查找开始
while (p->next != NULL)
{
if (p->next->data == x)
{
break;
p = p->next; //查找结束
}
if (p ->next == NULL)
{
return 0;
}
else //删除部分
{
q = p->next;
p->next = p->next->next;
free(q);
return 1;
}
}
}
参考书目
《2022数据结构高分笔记》 ——率辉