正在学习ing~
会继续更新
如有错误,欢迎指正!
目录
一.线性表-顺序存储
顺序表中的节点:
相关代码实现:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct LNODE{
int Data[MAXSIZE];
int last;//最后一个数据下标 无数据时为-1
}*List;//list为一个结构体指针
List L;
List IntitLink()//初始化链表返回初始化的指针
{
List L;
L=(List)malloc(sizeof(LNODE));
L->last=-1;//初始时无数据
printf("链表创建成功!\n");
return L;
}
int input(List L)//顺序插入数据
{
int n;
int m;
int d;
printf("请输入插入数据个数:");
scanf("%d",&n);
if(n>=MAXSIZE||n<=-1)
{
printf("位置错误!");
return -1;
}
for(int i=0;i<n;i++)
{
printf("第%d个数据:",++m);
scanf("%d",&d);
L->Data[++L->last]=d;
}
return 1;
}
int Find(List L)//查找数据
{
int n=0;
int i=0;
printf("请输入要查找的数据:");
scanf("%d",&n);
while(i<=L->last&&L->Data[i]!=n)
{
i++;
}
if(L->Data[i]==n){
printf("查找成功,下标为%d\n",i);
return i;
}else{
printf("查找失败!\n");
return -1;
}
}
int insert(List L)//在指定位置前插入一个数据
{
int n;
int a,b;
printf("请输入要插入位置:(不是下标)\n");
scanf("%d",&a);
printf("请输入要插入的元素:");
scanf("%d",&b);
if(L->last==MAXSIZE-1)
{
printf("位置已满\n");
return -1;
}
if(a<0||a>=MAXSIZE)
{
printf("位置不合法\n");
return -1;
}
for(int i=L->last;i>=a-1;i--){
L->Data[i+1]=L->Data[i];
//printf("\ni=%d\n",i);
}
L->Data[a-1]=b;
L->last++;
return 1;
}
int Delet(List L)//删除
{
int n;
int m;
printf("请输入要删除元素的位置:(不是下标)\n");
scanf("%d",&n);
m=n-1;
if(m<-1||m>=MAXSIZE)
{
printf("位置不合法!");
return -1;
}
for(int i=m;i<=L->last;i++)
{
L->Data[i]=L->Data[i+1];
}
L->last--;
return 1;
}
void Print(List L)//打印表内数据
{
printf("表内数据为:\n");
for(int i=0;i<=L->last;i++)
{
printf("%d ",L->Data[i]);
}
}
int main()
{
List L=IntitLink();
input(L);
Print(L);
Find(L);
insert(L);
Print(L);
Delet(L);
Print(L);
return 0;
}
二.线性表-链表存储
链表的插入操作:
链表的删除:
三.栈与队列
栈
可用顺序结构与链式结构
栈的应用--递归
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。
斐波那契数列指的是这样一个数列:
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711……
它的规律是:这个数列从第 3 项开始,每一项都等于前两项之和。
在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*),显然,斐波那契数列是一个线性递推数列。
//斐波那契的递归函数
int FBi(int i)
{
if(i<2)
return i==0?0:1;
return Fbi(i-1)+FBi(i-2);
}
后缀表达式的应用--计算机计算加减乘除先将中缀表达式转化为后缀表达式
队列
循环队列
front指向队头元素。rear指向队尾元素的下一个元素。
队列为空时rear也等于front,那么如何判断是空还是满了呢?
第一种方法:设置一个flag,当front==rear且flag=0时为队列空,当front==rear且flag=1时为队列满
第二种方法:队列空时就是front=rear,当队列满时,修改条件,保留一个元素空间,也就是说队列满时,数组中还有一个空闲单位。队列满时(rear+1)%maxsize==front,maxsize为队列最大尺寸,通用队列长度公式:(rear+front+maxsize)%maxsize。
四.串
五.树
树的度:节点的子树个数(最大的)
叶节点:度为零的节点
森林:是m(m>=0)棵互不相交的树的集合。
树的表示
双亲表示法
/* 树的双亲表示法结点结构定义 */
#define MAX_TREE_SIZE 100
/* 树结点的数据类型,目前暂定为整型 */
typedef int TElemType;
/* 结点结构 */
typedef struct PTNode
{
/* 结点数据 */
TElemType data;
/* 双亲位置 */
int parent;
} PTNode;
/* 树结构 */
typedef struct
{
/* 结点数组 */
PTNode nodes[MAX_TREE_SIZE];
/* 根的位置和结点数 */
int r, n;
} PTree
六.图
七.查找
八.排序
8.1直接插入排序
void insertsort(int a[],int n)
{
int temp;
int j=0;
int i=0;
for(i=1;i<n;i++)
{
if(a[i]<a[i-1])
{
temp=a[i];
for(j=i-1;a[j]>temp&&j>=0;j--)
{
a[j+1]=a[j];
}
a[j+1]=temp;
}
}
}
用哨兵后不用每轮循环都判断j>=0
void InsertSort(int A[], int n){ //A中从1开始存储,0放哨兵
int i,j;
for(i=1; i<n; i++)
if(A[i]<A[i-1]){
A[0] = A[i]; //复制为哨兵
for(j=i-1; A[0] < A[j]; --j) //从后往前查找待插入位置
A[j+1] = A[j]; //向后挪动
A[j+1] = A[0]; //复制到插入位置
}
}
8.2折半插入排序
void InsertSort(int A[], int n){
int i,j,low,high,mid;
for(i=2;i<=n;i++){
A[0] = A[i]; //将A[i]暂存到A[0]
low = 1; high = i-1; //折半查找的范围
while(low<=high){ //折半查找
mid = (low + high)/2; //取中间点
if(A[mid]>A[0]) //查找左半子表
high = mid - 1;
else //查找右半子表
low = mid + 1;
}
for(j=i-1; j>high+1;--j) //统一后移元素,空出插入位置
A[j+1] = A[j];
A[high+1] = A[0]
}
}
c语言笔记
结构体
typedef struct student
{
int name;
int score;
}stu;
//这里的stu就相当于struct student
//申请变量时使用的
C语言不允许全局变量在函数外进行赋值。除非是在定义变量的时候顺带一起对其进行初始化。