第一章:数据结构绪论
概念
数据其实就是符号,他们有两个共性:
1.可以输入到计算机中
2.能被及算你程序处理
数据项是数据不可分的最小单位。
数据结构
逻辑结构:
-
集合结构
-
线性结构
-
树形结构
-
图形结构
物理结构: -
顺序存储结构
-
链式存储结构(存储单元可以是连续的,也可以不可连续)
在c语言中,数据结构可以分为两类:
抽象数据类型:
抽象数据类型的标准形式
第二章:算法
概念
算法的基本特性:
-
输入
-
输出
-
有穷性
-
确定性
-
可行性
算法程序设计的特点: -
正确性
-
可读性
-
健壮性
-
时间效率高和存储量低
时间复杂度
常数阶:O (1)
线性阶:O(n)
对数阶:O (logn)
平方阶:O (n^2)
重点重点重点!
第三章:线性表
概念
List:零个或者多个数据元素的有限序列
线性表的链式存储结构
头结点和头指针的异同点:
如果线性表为空表,则头结点的指针域为“空”,表示为空链表。
- 创建:
void CreateListTail(LinkList *L, int n) {
LinkList p,r;
srand(time(0)); /* 初始化随机数种子 */
*L = (LinkList)malloc(sizeof(Node)); /* L为整个线性表 */
r=*L; /* r为指向尾部的结点 */
for (int i=0; i<n; i++) {
p = (Node *)malloc(sizeof(Node)); /* 生成新结点 */
p->data = rand()%100+1; /* 随机生成100以内的数字 */
r->next=p; /* 将表尾终端结点的指针指向新结点 */
r = p; /* 将当前的新结点定义为表尾终端结点 */
}
r->next = NULL; /* 表示当前链表结束 */
}
- 查找
int GetElem(LinkList L,int i,int *e){
int j;
LinkList p; /* 声明一结点p */
p = L->next; /* 让p指向链表L的第一个结点 */
j = 1; /* j为计数器 */
while (p && j<i) /* p不为空或者计数器j还没有等于i时,循环继续 */
{
p = p->next; /* 让p指向下一个结点 */
++j;
}
if ( !p || j>i )
return 0; /* 第i个元素不存在 */
*e = p->data; /* 取第i个元素的数据 */
return 1;
}
- 插入
int ListInsert(LinkList *L,int i,int e){
int j;
LinkList p,s;
p = *L;
j = 1;
while (p && j < i) /* 寻找第i个结点 */
{
p = p->next;
++j;
}
if (!p || j > i)
return 0; /* 第i个元素不存在 */
s = (LinkList)malloc(sizeof(Node)); /* 生成新结点(C语言标准函数) */
s->data = e;
s->next = p->next; /* 将p的后继结点赋值给s的后继 */
p->next = s; /* 将s赋值给p的后继 */
return 1;
}
- 删除结点
int ListDelete(LinkList *L,int i,int *e)
{
int j;
LinkList p,q;
p = *L;
j = 1;
while (p->next && j < i) /* 遍历寻找第i个元素 */
{
p = p->next;
++j;
}
if (!(p->next) || j > i)
return 0; /* 第i个元素不存在 */
q = p->next;
p->next = q->next; /* 将q的后继赋值给p的后继 */
*e = q->data; /* 将q结点中的数据给e */
free(q); /* 让系统回收此结点,释放内存 */
return 1;
}
- 删除整表
int ClearList(LinkList *L){
LinkList p,q;
p=(*L)->next; /* p指向第一个结点 */
while(p) /* 没到表尾 */
{
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL; /* 头结点指针域为空 */
return 1;
}