当前位置: 首页 > news >正文

西南科技大学814考研二

C语言数据结构与算法

线性表

顺序表(静态分配内存)

#include <stdio.h>
#include <stdbool.h>
//静态顺序表
#define MAX_SIZE 8
//顺序表储存的数据类型
typedef int ElemType;
typedef struct {ElemType data[MAX_SIZE];int length;
}SeqList;
//初始化顺序表
void initSeqList(SeqList *L){for (int i = 0; i < MAX_SIZE; i++) {L->data[i] = 0;  // 将数组中的所有元素初始化为0}L->length = 0;       // 将顺序表的长度初始化为0
}
//数组创建顺序表
bool createSeqList(SeqList *L,ElemType array[],int l){if(l<0||l>MAX_SIZE){return false;}for(int i=0;i<l;i++){L->data[i]=array[i];L->length++;}return true;
}
//打印顺序表里面的元素
void printSeqList(SeqList *L){for(int i=0;i<L->length;i++){printf("%d ",L->data[i]);};
}
//获得顺序表长度
int SeqListSize(SeqList *q){return q->length;
}
//尾插
bool tailInsert(SeqList *L,ElemType e){if(L->length+1>MAX_SIZE){return false;}else{L->data[L->length]=e;L->length=L->length+1;return true;}
}
//i位置插入e
bool SeqListInsert(SeqList *L,int i,ElemType e){if(i<1||i>MAX_SIZE){return false;}else{for(int j = L->length;j>=i;j--){L->data[j]=L->data[j-1];}L->data[i-1]=e;L->length=L->length+1;}
}
//i位置删除e
bool SeqListDelete(SeqList *L,int i){if(i<1||i>MAX_SIZE){return false;}else{for(int j = i-1;j<L->length;j++){L->data[j]=L->data[j+1];}L->length=L->length-1;}
}int main() {//定义SeqList L;//初始化initSeqList(&L);ElemType a[5]={2,3,1,6,7};//创建createSeqList(&L,&a,5);//输出printSeqList(&L);//获取顺序表长度printf("顺序表长度:%d\n", SeqListSize(&L));//尾插ElemType e = 10;tailInsert(&L,e);printSeqList(&L);printf("顺序表长度:%d\n",SeqListSize(&L));//选择位置插入printf("----------\n");SeqListInsert(&L,2,5);printSeqList(&L);printf("顺序表长度:%d\n",SeqListSize(&L));//选择位置删除printf("----------\n");SeqListDelete(&L,2);printSeqList(&L);printf("顺序表长度:%d\n",SeqListSize(&L));return  0;
}

顺序表(动态分配内存)

#include <stdio.h>  
#include <stdlib.h>  typedef struct {  int *data;   // 指向动态分配数组的指针  int size;    // 当前数组的大小  int capacity; // 数组的总容量  
} SequentialList;  // 初始化顺序表  
SequentialList* initSequentialList() {  SequentialList *list = (SequentialList*)malloc(sizeof(SequentialList));  if(list) {  list->data = NULL;  list->size = 0;  list->capacity = 0;  }  return list;  
}  // 向顺序表添加元素,如果容量不足则扩大容量  
int addElement(SequentialList *list, int element) {  if(list->size == list->capacity) { // 如果容量不足,扩大容量  list->capacity = list->capacity == 0 ? 1 : list->capacity * 2;  list->data = (int*)realloc(list->data, list->capacity * sizeof(int)); // 使用realloc来重新分配内存  if(!list->data) { // 如果realloc失败,返回错误  printf("Realloc failed.\n");  return -1;  }  }  list->data[list->size++] = element; // 添加元素到数组末尾,并增加size  return 0;  
}  // 打印顺序表的所有元素  
void printList(SequentialList *list) {  for(int i = 0; i < list->size; i++) {  printf("%d ", list->data[i]);  }  printf("\n");  
}  // 销毁顺序表,释放动态分配的内存  
void destroySequentialList(SequentialList *list) {  if(list) {  free(list->data); // 释放动态分配的数组  free(list); // 释放顺序表结构体本身的内存  }  
}  int main() {  SequentialList *list = initSequentialList();  for(int i = 0; i < 10; i++) { // 向顺序表添加10个元素  addElement(list, i);  }  printList(list); // 打印顺序表的所有元素  destroySequentialList(list); // 销毁顺序表,释放动态分配的内存  return 0;  
}

单链表(不带头)

#include <stdio.h>
#include <stdbool.h>
#include <malloc.h>
//单链表储存的数据类型
typedef int ElemType;
typedef struct {ElemType data;struct LNode *next;
}LNode;int ListSize(LNode *ptr);//初始化单链表
void InitList(LNode *L){L= (LNode*)malloc(sizeof(LNode));L->next=NULL;
}
//数组创建顺序表
LNode *ArrayToList(ElemType array[],int l){// 如果数组为空,则返回空链表if (array == NULL || l == 0) {return NULL;}//定义头节点LNode *head=(LNode*)malloc(sizeof(LNode));head->data=0;head->next=NULL;LNode *temp=head;for(int i=0;i<l;i++){LNode *Node=(LNode*)malloc(sizeof(LNode));Node->data=array[i];Node->next=NULL;temp->next=Node;temp=Node;}//不带头单链表,所以返回头的下一个节点return head->next;
}
//单链表长度
int ListSize(LNode *L){LNode *p=L;int length = 0;while(p!=NULL){length++;p=p->next;}return length;
}
//头插
void InsertAtHead(LNode **L,ElemType e){if(e==NULL){printf("插入数据为空");}else if(L==NULL){LNode *Node = (LNode*)malloc(sizeof(LNode));Node->data=e;Node->next=NULL;L=&Node;}else{LNode *Node = (LNode*)malloc(sizeof(LNode));Node->data=e;Node->next=*L;*L=Node;}
}
//头删
void DeletedFirstNode(LNode **L){if(L==NULL){printf("单链表为空!");}else{LNode *first=*L;*L=first->next;free(first);}
}
//尾插
void InsertAtTail(LNode **L,ElemType e){if(e==NULL){printf("插入数据为空");}else if(L==NULL){LNode *Node = (LNode*)malloc(sizeof(LNode));Node->data=e;Node->next=NULL;*L=&Node;}else{LNode *Node = (LNode*)malloc(sizeof(LNode));Node->data=e;Node->next=NULL;//找到原来最后一个LNode *P = *L;while (P->next!=NULL){P=P->next;}P->next=Node;}
}
//尾删
void DeleteLastNode(LNode **L){if(L==NULL){printf("单链表为空");}else{LNode *prev = NULL;LNode *curr = *L;while (curr->next!=NULL){prev=curr;curr=curr->next;}prev->next=NULL;free(curr);}
}
//第i位置插入
void InsertAtI(LNode **L,int i,ElemType e){if(i>ListSize(*L)+1||i<=0){printf("插入位置必须大于0小等于单链表长度\n");}else if(i==1){InsertAtHead(L,e);}else if(i== ListSize(*L)+1){InsertAtTail(L,e);}else{int index = 1;LNode *p = NULL;LNode * q = *L;while (index < i){p=q;q=p->next;index++;}LNode *s = (LNode *)malloc(sizeof(LNode));s->data=e;s->next=q;p->next=s;}}
//第i个位置删除
void DeleteAtI(LNode **L,int i){if(i>ListSize(*L)||i<1){printf("插入位置必须大于0小等于单链表长度");}else{int index = 1;LNode *p = NULL;LNode * q = *L;while (index != i){p=q;q=p->next;index++;}p->next=q->next;q->next=NULL;free(q);}}//打印单链表里面的元素
void PrintList(LNode *L){LNode *p = L;while (p!=NULL){printf("%d ",p->data);p=p->next;}
}// 得到第i个位置的元素
void  getAtINodeData(LNode **L,int i){if(i<1||i> ListSize(*L)){printf("查找位置不存在");}else{LNode *p=*L;int index = 1;while(index<i&&p->next!=NULL){p=p->next;index++;}printf("%d位置的元素是%d\n",i,p->data);}
}
//获得某个元素的位置
int GetPosition(LNode **L,ElemType e){int index =1;LNode *t = *L;while(t->next!=NULL){if(t->data==e){break;}index++;t=t->next;}return index;
}int main() {ElemType a[5]={2,3,1,6,7};//数组转换为单链表LNode *L= ArrayToList(a,5);//输出PrintList(L);printf("\n");//链表长度printf("不带头单链表长度%d\n", ListSize(L));//头插InsertAtHead(&L,1);printf("头插后\n");PrintList(L);//头删DeletedFirstNode(&L);printf("头删后\n");PrintList(L);//尾插InsertAtTail(&L,8);printf("尾插后\n");PrintList(L);//尾删DeleteLastNode(&L);printf("尾插后\n");PrintList(L);//第三位置插入InsertAtI(&L,3,4);printf("插入后\n");PrintList(L);//第三位置删除DeleteAtI(&L,3);printf("删除后\n");PrintList(L);//InsertAtI(&L,6,4);printf("插入后\n");PrintList(L);//查找某个位置上的元素printf("\n");getAtINodeData(&L,2);//查找元素的位置ElemType e = 7;int index = GetPosition(&L,e);printf("%d元素位置在%d\n",e,index);return  0;
}

单链表(带头)

#include <stdio.h>
#include <stdbool.h>
#include <malloc.h>
#include <stdlib.h>//单链表储存的数据类型
typedef int ElemType;
typedef struct {ElemType data;struct LNode *next;
}LNode;//初始化单链表
void InitList(LNode *L){L= (LNode*)malloc(sizeof(LNode));L->next=NULL;
}
//创建头节点
LNode *CreateHeadNode(){LNode *head=(LNode*)malloc(sizeof(LNode));if (head == NULL) {printf("创建失败\n");exit(1);}head->data = 0;      // 头节点数据域随意赋值,此处为0head->next = NULL;return head;
}
//数组创建顺序表
LNode *ArrayToList(ElemType array[],int l){// 如果数组为空,则返回空链表if (array == NULL || l == 0) {return NULL;}//定义头节点LNode *head=(LNode*)malloc(sizeof(LNode));head->data=0;head->next=NULL;LNode *temp=head;for(int i=0;i<l;i++){LNode *Node=(LNode*)malloc(sizeof(LNode));Node->data=array[i];Node->next=NULL;temp->next=Node;temp=Node;}//带头节点,返回头节点return head;
}
//单链表长度
int ListSize(LNode *head){LNode *p=head->next;int length = 0;while(p!=NULL){length++;p=p->next;}return length;
}
//打印单链表里面的元素
void PrintList(LNode *head){LNode *p = head->next;while (p!=NULL){printf("%d ",p->data);p=p->next;}
}
//头插
void InsertAtHead(LNode *head,ElemType e){if(e==NULL){printf("插入数据为空");}else if(head==NULL){printf("单链表为空");}else{LNode *Node = (LNode*)malloc(sizeof(LNode));Node->data=e;Node->next=head->next;head->next=Node;}
}
//头删
void DeletedFirstNode(LNode *head){if(head==NULL){printf("单链表为空!");}else{LNode *first=head->next;head->next=first->next;first->data=NULL;free(first);}
}
//尾插
void InsertAtTail(LNode *head,ElemType e){if(e==NULL){printf("插入数据为空");}else if(head==NULL){printf("单链表为空!");}else{LNode *Node = (LNode*)malloc(sizeof(LNode));Node->data=e;Node->next=NULL;//找到原来最后一个LNode *p = head;while (p->next!=NULL){p=p->next;}p->next=Node;}
}
//尾删
void DeleteLastNode(LNode *head){if(head==NULL){printf("单链表为空");}else{LNode *prev = NULL;LNode *curr = head;while (curr->next!=NULL){prev=curr;curr=curr->next;}prev->next=NULL;free(curr);}
}
//第i位置插入
void InsertAtI(LNode *head,int i,ElemType e){if(i>ListSize(head)+1||i<=0){printf("插入位置必须大于0小等于单链表长度\n");}else if(i==1){InsertAtHead(head,e);}else if(i== ListSize(head)+1){InsertAtTail(head,e);}else{int index = 1;LNode *p = NULL;LNode * q = head->next;while (index < i){p=q;q=p->next;index++;}LNode *s = (LNode *)malloc(sizeof(LNode));s->data=e;s->next=q;p->next=s;}}
//第i个位置删除
void DeleteAtI(LNode *head,int i){if(i>ListSize(head)||i<1){printf("插入位置必须大于0小等于单链表长度");}else{int index = 1;LNode *p = NULL;LNode * q = head;while (index != i){p=q;q=p->next;index++;}p->next=q->next;q->next=NULL;free(q);}
}
// 得到第i个位置的元素
void  getAtINodeData(LNode *head,int i){if(i<1||i> ListSize(head)){printf("查找位置不存在");}else{LNode *p=head->next;int index = 1;while(index<i&&p->next!=NULL){p=p->next;index++;}printf("%d位置的元素是%d\n",i,p->data);}
}
//获得某个元素的位置
int GetPosition(LNode *head,ElemType e){int index =0;LNode *t = head;while(t->next!=NULL){if(t->data==e){break;}index++;t=t->next;}return index;
}int main() {ElemType a[5]={2,3,1,6,7};//数组转换为单链表LNode *L= ArrayToList(a,5);//输出PrintList(L);printf("\n");//链表长度printf("不带头单链表长度%d\n", ListSize(L));//头插InsertAtHead(L,1);printf("头插后\n");PrintList(L);//头删DeletedFirstNode(L);printf("头删后\n");PrintList(L);//尾插InsertAtTail(L,8);printf("尾插后\n");PrintList(L);//尾删DeleteLastNode(L);printf("尾删后\n");PrintList(L);//第三位置插入InsertAtI(L,3,4);printf("插入后\n");PrintList(L);//第三位置删除DeleteAtI(L,3);printf("删除后\n");PrintList(L);//查找某个位置上的元素printf("\n");getAtINodeData(L,3);//查找元素的位置ElemType e = 2;int index = GetPosition(L,e);printf("%d元素位置在%d\n",e,index);return  0;
}

排序算法

插冒龟(稳定)选冒插(平方)

选择排序-O(n^2)

第一个与后面比较,大;交换

#include <stdio.h>
int main() {int array [8]={4,1,6,8,2,3,9,5};int l = sizeof (array)/sizeof (int);printf("选择排序前:");for(int i=0;i<l;i++){printf("%d ",array[i]);};for(int i = 0;i<l-1;i++){for(int j = i+1;j<l-i;j++){if(array[i]>array[j]){int temp =array[i];array[i]=array[j];array[j]=temp;}}};printf("选择排序后:");for(int i=0;i<l;i++){printf("%d ",array[i]);};return 0;
}

冒泡排序-O(n^2)

两两比较–比它大交换–第一次循环找出最大

#include <stdio.h>
int main() {int array [8]={4,1,6,8,2,3,9,5};int l = sizeof (array)/sizeof (int);printf("冒泡排序前:");for(int i=0;i<l;i++){printf("%d ",array[i]);};for(int i = 0;i<l;i++){for(int j = 0;j<l-i-1;j++){if(array[j]>array[j+1]){int temp =array[j];array[j]=array[j+1];array[j+1]=temp;}}};printf("冒泡排序后:");for(int i=0;i<l;i++){printf("%d ",array[i]);};return 0;
}

直接插入排序-O(n^2)

元素移动位置

#include <stdio.h>
int main() {int array [8]={1,5,6,4,3,2,9,8};int l = sizeof (array)/sizeof (int);printf("插入排序前:");for(int i=0;i<l;i++){printf("%d ",array[i]);};for(int i = 1;i<l;i++){//从第一个与前面已经排好序,从第一个开始int j = i-1;int temp = array[i];while(j>=0&&array[j]>temp){//循环判断比i位置大的都后移(已经排好序可以直接后移动一位)array[j+1]=array[j];j--;};//循环结束后的当前j的后一位是i位置的值array[j+1]=temp;};printf("插入排序后:");for(int i=0;i<l;i++){printf("%d ",array[i]);};return 0;
}

希尔排序-O(n^1.3~1.5)

按照距离d进行插入排序

#include <stdio.h>
void shellSort(int arr[], int n) {// 定义增量gapfor (int gap = n / 2; gap > 0; gap /= 2) {// 对每个子数组进行插入排序for (int i = gap; i < n; i++) {int temp = arr[i];int j=i-gap;while (j>=0&&arr[j]>temp){arr[j+gap]=arr[j];j=j-gap;}arr[j+gap]=temp;}}
}int main() {int arr[] = {12, 34, 54, 2, 3};int n = sizeof(arr) / sizeof(arr[0]);printf("Original array: ");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");shellSort(arr, n);printf("Sorted array: ");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;}

归并排序-O(nlogn)

已尽排好序合并为一个例子a,b比较第一个谁大放入新合并数组;依次比较

#include <stdio.h>
//合并方法
void 
merge(int arr[], int left[], int left_size, int right[], int right_size) {int i = 0, j = 0, k = 0;while (i < left_size && j < right_size) {if (left[i] <= right[j]) {//先赋值//k,i在自增arr[k++] = left[i++];} else {arr[k++] = right[j++];}}//两个数组长度不一样;剩余直接加while (i < left_size) {arr[k++] = left[i++];}while (j < right_size) {arr[k++] = right[j++];}
}
//分数组分为左数组;右数组
void mergeSort(int arr[], int size) {if (size < 2) {return;}int mid = size / 2;int left[mid], right[size - mid];for (int i = 0; i < mid; i++) {left[i] = arr[i];}for (int i = mid; i < size; i++) {right[i - mid] = arr[i];}//继续分mergeSort(left, mid);mergeSort(right, size - mid);//先1,2;3,4;合并//1,2合并后整体与3,4和并后的整体在进行合并merge(arr, left, mid, right, size - mid);
}int main() {int arr[] = {12, 34, 54, 2, 3};int size = sizeof(arr) / sizeof(arr[0]);printf("Original array: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");mergeSort(arr, size);printf("Sorted array: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

快速排序O(nlogn)

//找第一个为基准,比它大的在右边,小的左边,

//递归

#include <stdio.h>
void quickSort(int arr[], int left, int right) {if (left >= right) {return;}int pivot = arr[left];int i = left, j = right;while (i < j) {while (i < j && arr[j] >= pivot) {j--;}arr[i] = arr[j];while (i < j && arr[i] <= pivot) {i++;}arr[j] = arr[i];}arr[i] = pivot;quickSort(arr, left, i - 1);quickSort(arr, i + 1, right);
}int main() {int arr[] = {12, 34, 54, 2, 3};int size = sizeof(arr) / sizeof(arr[0]);printf("Original array: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");quickSort(arr, 0, size - 1);printf("Sorted array: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

堆排序-O(nlogn)

大根堆:根>右孩子、左孩子

大根堆:根<右孩子、左孩子

步骤:构建堆,取根放数组最后,取最后叶子节点放根,调整堆

#include <stdio.h>
// 调整堆
void heapify(int arr[], int n, int i) {int largest = i; // 初始化根节点索引为最大值int left = 2 * i + 1; // 左子节点索引int right = 2 * i + 2; // 右子节点索引// 如果左子节点比根节点大,更新最大值索引if (left < n && arr[left] > arr[largest]) {largest = left;}// 如果右子节点比当前最大值大,更新最大值索引if (right < n && arr[right] > arr[largest]) {largest = right;}// 如果最大值不是根节点,交换它们的值,并递归调整堆if (largest != i) {int temp = arr[i];arr[i] = arr[largest];arr[largest] = temp;heapify(arr, n, largest);}
}// 堆排序函数
void heapSort(int arr[], int n) {// 从最后一个非叶子节点开始,逐个调整堆for (int i = n / 2 - 1; i >= 0; i--) {heapify(arr, n, i);}// 从堆顶开始取出元素,放到末尾,并调整堆for (int i = n - 1; i >= 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;heapify(arr, i, 0);}}int main() {int arr[] = {12, 11, 13, 5, 6, 7};int n = sizeof(arr) / sizeof(arr[0]);printf("Original array: ");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");heapSort(arr, n);printf("Sorted array: ");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

查找算法

二分查找

  1. 折半查找,又称二分查找,是一种在有序数组中查找特定元素的搜索算法。通过每次与中间元素比较,可以确定要查找的元素是在中间元素的左侧还是右侧,从而将搜索范围减半,直到找到目标元素或搜索范围为空。对于数组 a[12]=(15,26,34,39,45,56,58,63,74,76,83,94):1. 查找元素 34:第一次比较,中间元素是 39,34小于39,所以在左侧区间(15,26,34)查找。第二次比较,中间元素是 26,34大于26,所以在区间(26,34)查找。第三次比较,找到元素 34。总共比较次数:3次。
    2. 查找元素 56:第一次比较,中间元素是 39,56大于39,所以在右侧区间(45,56,58,63,74,76,83,94)查找。第二次比较,中间元素是 58,56小于58,所以在区间(45,56)查找。第三次比较,找到元素 56。总共比较次数:3次。
    3. 查找元素 58:第一次比较,中间元素是 39,58大于39,所以在右侧区间查找。第二次比较,中间元素是 58,找到元素 58。总共比较次数:2次。
    4. 查找元素 63:第一次比较,中间元素是 39,63大于39,所以在右侧区间查找。第二次比较,中间元素是 58,63大于58,所以在区间(58,63,74,76,83,94)查找。第三次比较,找到元素 63。总共比较次数:3次。
    5. 查找元素 94:第一次比较,中间元素是 39,94大于39,所以在右侧区间查找。第二次比较,中间元素是 76,94大于76,所以在区间(76,83,94)查找。第三次比较,找到元素 94。总共比较次数:3次。
    
#include <stdio.h>int binarySearch(int arr[], int left, int right, int target) {//首位值和尾位置while (left <= right) {//中间位置int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid;//如果目标小于中间,尾部位置是中间位置减一} else if (arr[mid] > target) {right = mid - 1;//如果目标小于中间,尾部位置是中间位置减一} else {left = mid + 1;}}return -1; //目标元素不存在}int main() {int arr[] = {1, 3, 5, 7, 9};int n = sizeof(arr) / sizeof(arr[0]);int target = 5;int index = binarySearch(arr, 0, n - 1, target);if (index == -1) {printf("目标元素不存在\n");} else {printf("目标元素的下标为:%d\n", index);}return 0;}

二分查找判定树(平衡树)

每次选二分那个点的为根节点,只有两个节点时选择第一个节点

在这里插入图片描述

顺序表实现

#include <stdio.h>
#include <stdbool.h>
#include <malloc.h>
#define MAX_SIZE 10
typedef int ElemType;
typedef struct {ElemType data[MAX_SIZE];int top;
}Stack;
//初始化
void InitStack(Stack *stack){int length = sizeof(stack->data)/ sizeof(ElemType);for (int i = 0; i < length; ++i) {stack->data[i]=0;}stack->top=-1;
}// 判断栈是否为空
int isStackEmpty(Stack *stack) {return stack->top == -1;}// 判断栈是否已满
int isStackFull(Stack *stack) {return stack->top == MAX_SIZE - 1;
}
// 入栈操作
void push(Stack *stack, int value) {if (isStackFull(stack)) {printf("栈已满\n");return;}stack->top++;stack->data[stack->top] = value;}// 出栈操作
int pop(Stack *stack) {if (isStackEmpty(stack)) {printf("栈已空\n");return -1;}int value = stack->data[stack->top];stack->top--;return value;
}// 获取栈顶元素
int getTop(Stack *stack) {if (isStackEmpty(stack)) {printf("栈已空\n");return -1;}return stack->data[stack->top];
}int main() {//声明Stack s;//初始化InitStack(&s);//入栈push(&s,1);push(&s,2);push(&s,3);push(&s,4);//获取栈顶printf("栈顶元素:%d\n", getTop(&s));//出栈printf("%d\n", pop(&s));printf("%d\n", pop(&s));printf("%d\n", pop(&s));printf("%d\n", pop(&s));return  0;
}

链表实现

#include <stdio.h>
#include <stdbool.h>
#include <malloc.h>
typedef struct {int data;struct Node *next;
}Node;
//初始化
void InitStack(Node *head){head->data=0;head->next=NULL;
}
//// 入栈操作--头插
void push(Node *stack, int e) {Node *temp = (Node*)malloc(sizeof(Node));temp->data=e;temp->next=stack->next;stack->next=temp;
}// 出栈操作
int pop(Node *stack) {Node *temp=stack->next;int value=temp->data;stack->next=temp->next;free(temp);return value;
}// 获取栈顶元素
int getTop(Node *stack) {if (stack == NULL) {printf("空栈\n");return -1;}Node *temp = stack->next;int value = temp->data;return value;
}int main() {//声明Node s;//初始化InitStack(&s);//入栈push(&s,1);push(&s,2);push(&s,3);push(&s,4);//获取栈顶printf("栈顶元素:%d\n", getTop(&s));//出栈printf("%d\n", pop(&s));printf("%d\n", pop(&s));printf("%d\n", pop(&s));printf("%d\n", pop(&s));return  0;
}

优先级

假设表达式中允许包含 3种括号:圆括号、方括号和大括号。设计算法判断给定表达式中的括号是否正确配对。

#include <stdio.h>  
#include <stdlib.h>  #define MAX_SIZE 100  char expression[MAX_SIZE];  // 检查括号是否匹配  
int isMatch(char a, char b) {  if (a == '(' && b == ')') return 1;  if (a == '[' && b == ']') return 1;  if (a == '{' && b == '}') return 1;  return 0;  
}  // 检查表达式中的括号是否配对  
int checkBrackets(char* exp) {  int top = -1;  for (int i = 0; exp[i]; i++) {  if (exp[i] == '(' || exp[i] == '[' || exp[i] == '{') {  // 如果是左括号,则入栈  if (top == MAX_SIZE - 1) {  printf("堆栈溢出,表达式错误\n");  return -1;  } else {  top++;  expression[top] = exp[i];  }  } else if (exp[i] == ')' || exp[i] == ']' || exp[i] == '}') {  // 如果是右括号,则检查栈顶元素是否与之匹配  if (top == -1) {  printf("表达式中的括号不匹配\n");  return -1;  } else if (!isMatch(expression[top], exp[i])) {  printf("表达式中的括号不匹配\n");  return -1;  } else {  top--;  }  }  }  // 如果栈为空,则括号都匹配  if (top == -1) {  printf("表达式中的括号都匹配\n");  return 1;  } else {  printf("表达式中的括号不匹配\n");  return -1;  }  
}  int main() {  char exp[MAX_SIZE];   printf("请输入一个包含括号的表达式:");   fgets(exp, MAX_SIZE, stdin); // 从标准输入读取表达式  checkBrackets(exp); // 检查表达式中的括号是否配对  return 0;  
}

队列

循环队列(数组实现)

#include <stdio.h>
#define QUEUE_SIZE 5
//循环队列
typedef struct Queue {int data[QUEUE_SIZE];int front; // 队头索引int rear; // 队尾索引
} Queue;
// 初始化队列
void init(Queue* queue) {queue->front = 0;queue->rear = 0;
}// 判断队列是否为空
int is_empty(Queue* queue) {return queue->front == queue->rear;
}// 判断队列是否已满
int is_full(Queue* queue) {return (queue->rear + 1) % QUEUE_SIZE == queue->front;
}// 入队操作
void enqueue(Queue* queue, int data) {if (is_full(queue)) {printf("队列已满\n");return;}queue->data[queue->rear] = data;queue->rear = (queue->rear + 1) % QUEUE_SIZE;}// 出队操作
int dequeue(Queue* queue) {if (is_empty(queue)) {printf("队列为空\n");return -1; // 返回一个错误码,表示队列为空}int data = queue->data[queue->front];queue->front = (queue->front + 1) % QUEUE_SIZE;return data;}
int main (){Queue q;init(&q);enqueue(&q,1);enqueue(&q,2);enqueue(&q,3);enqueue(&q,4);return 0;
}

队列(链表实现)

#include <stdio.h>
#include <stdlib.h>typedef struct node {int data;struct node *next;
} Node;typedef struct queue {Node *front; // 队头指针Node *rear; // 队尾指针
} Queue;// 初始化队列
void init_queue(Queue *q) {q->front = NULL;q->rear = NULL;
}// 判断队列是否为空
int is_queue_empty(Queue *q) {return q->front == NULL;}// 入队操作
void enqueue(Queue *q, int value) {Node *new_node = (Node*) malloc(sizeof(Node));new_node->data = value;new_node->next = NULL;//空队列首尾指针都指向if (is_queue_empty(q)) {q->front = new_node;q->rear = new_node;} else {//原来尾指针指向的下一个是插入节点q->rear->next = new_node;//现在尾部指针指向插入节点q->rear = new_node;}}// 出队操作
int dequeue(Queue *q) {if (is_queue_empty(q)) {printf("Queue is empty!\n");return -1;}int value = q->front->data;Node *temp = q->front;//首指针现在指向是原来指向节点的下一个节点q->front = q->front->next;free(temp);return value;}// 获取队头元素
int get_front(Queue *q) {if (is_queue_empty(q)) {printf("Queue is empty!\n");return -1;}return q->front->data;}// 获取队列长度
int get_queue_length(Queue *q) {int length = 0;Node *current = q->front;while (current != NULL) {length++;current = current->next;}return length;}// 打印队列元素
void print_queue(Queue *q) {if (is_queue_empty(q)) {printf("Queue is empty!\n");return;}printf("Queue elements: ");Node *current = q->front;while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");}
int main (){Queue q;init_queue(&q);enqueue(&q,1);enqueue(&q,2);enqueue(&q,3);enqueue(&q,4);printf("现在队头%d\n", get_front(&q));printf("现在长度%d\n", get_queue_length(&q));//出队dequeue(&q);printf("现在队头%d\n", get_front(&q));printf("现在长度%d\n", get_queue_length(&q));return 0;
}

二叉树(顺序实现)

在C语言中,可以使用数组来存储二叉树。一般来说,二叉树在数组中的存储方式是基于二叉树的层序遍历。对于任意一个节点,如果它在数组中的下标为i,那么它的左孩子的下标就是2*i+1右孩子的下标就是2*i+2

数组下标0开始

根0,左孩子1,右孩子2

这种方式有一个缺点,那就是对于空节点也要分配存储空间,造成空间的浪费。在上述例子中,我们为8个节点分配了空间,但实际上只有7个节点。

二叉树(链表实现)

满二叉树:一个二叉树,如果每一个层级的节点数都达到最大,则这个二叉树就是满二叉树。也就是说,每个节点要么是叶节点(没有子节点),要么就有两个子节点。这种类型的二叉树具有最大的节点数,对于给定的层数。也就是说,对于任何一层i,节点的数量是2^i。

完全二叉树:对于深度为h的二叉树,如果第0层至第h-1层的节点数达到最大,且第h层所有的节点都连续集中在最左边,那么这就是一棵完全二叉树。也就是说,完全二叉树除了最底层外,其它各层的节点数都达到最大,且最底层尽可能地向左填充。

#include <stdio.h>
#include <stdlib.h>
//定义节点
typedef struct node {int data;struct node *left;struct node *right;
} Node;
//创建节点
Node * CreateNode(int e){Node *node = (Node *)malloc(sizeof(Node));node->data=e;node->left=NULL;node->right=NULL;return node;
}
//插入二叉树
Node *InsertNode(Node *tree,int e){//父节点为空if(tree==NULL){return CreateNode(e);}else if(e<=tree->data){          //左孩子值比父节点的值小,tree->left= InsertNode(tree->left,e);}else{               //右孩子值比父节点的值大tree->right= InsertNode(tree->right,e);}
}
//先序遍历--根左右
void preorder_traversal(Node *tree){if(tree != NULL){printf("%d ",tree->data);preorder_traversal(tree->left);preorder_traversal(tree->right);}
}
//中序遍历--左根右
void inorder_traversal(Node *root) {if (root != NULL) {inorder_traversal(root->left);printf("%d ", root->data);inorder_traversal(root->right);}
}// 后序遍历二叉树
void postorder_traversal(Node *root) {if (root != NULL) {postorder_traversal(root->left);postorder_traversal(root->right);printf("%d ", root->data);}}
//求树的深度
int TreeDeep(Node *root)
{int deep=0;if(root!=NULL){//求左右子树的深度int leftdeep=TreeDeep(root->left);int rightdeep=TreeDeep(root->right);//比较左右子树,子树深度加上根=总深度deep=leftdeep>=rightdeep?leftdeep+1:rightdeep+1;}return deep;
}
//采用深度优先搜索获得二叉树的深度
int getDepth(Node* root) {if (root == NULL) {return 0;}int level = 1;Node* current = root;while(current->left != NULL ) {level++;if(current->left != NULL) {current = current->left;} else {break;}}level=level+1;return level;}
//递归获得二叉树的总节点
int countNodes(Node * root){if(root==NULL){return 0;}//总结点=根节点+左子树节点+右子树节点return 1+ countNodes(root->left)+ countNodes(root->right);
}
//计算叶子节点个数
int countYNodes(Node * root){if(root == NULL){return 0;}else if(root->left == NULL && root->right == NULL){return 1;}return countNodes(root->left)+ countNodes(root->right);
}int main (){Node *tree = CreateNode(1);tree = InsertNode(tree,2);tree = InsertNode(tree,3);tree = InsertNode(tree,4);tree = InsertNode(tree,5);tree = InsertNode(tree,6);tree = InsertNode(tree,7);tree = InsertNode(tree,8);printf("\n先序遍历:");preorder_traversal(tree);printf("\n中序遍历:");inorder_traversal(tree);printf("\n后序遍历:");postorder_traversal(tree);int deep = TreeDeep(tree);printf("树的深度%d\n",deep);int deep1 = getDepth(tree);printf("树的深度%d\n",deep1);int count=countNodes(tree);printf("总节点:%d",count);int ycount= countYNodes(tree);printf("叶子节点个数%d",ycount);return 0;
}

二叉树查找最小值

char findMin(TreeNode* root) {  // 如果根节点为空,返回空字符或者你可以定义一个默认值  if (root == NULL) {  return '\0';  }  // 当前节点的值  char current = root->val;  // 如果左子树存在,递归查找左子树的最小值  if (root->left != NULL) {  char left_min = findMin(root->left);  // 如果左子树的最小值小于当前值,则当前最小值应为左子树的最小值  if (left_min < current) {  current = left_min;  }  }  // 如果右子树存在,递归查找右子树的最小值  if (root->right != NULL) {  char right_min = findMin(root->right);  // 如果右子树的最小值小于当前值,则当前最小值应为右子树的最小值  if (right_min < current) {  current = right_min;  }  }  // 返回最小值  return current;  
}

二叉排序树(二叉查找树)BST

左子树所有节点值小于根节点值小于右子树所有节点值

中序遍历就是一个有序

已知后序,画图

例子:

一棵以字母为关键字的二叉排序树的后序遍历序列为:ACDBFIJHGE,

完成以下问题

(1)画出该二叉排序树:

(2)计算在等概率下查找成功的平均比较次数:

(3)计算在等概率下查找不成功的平均比较次数

二叉排序树中序就是有序:ABCDEFGHIJ

中后画出

在这里插入图片描述

查找成功的平均查找长度为:∑(本层高度*本层元素个数)/节点总数

查找不成功的平均查找长度:∑(本层高度*本层补上的叶子个数)/补上的叶子总数

在这里插入图片描述

平衡二叉树(AVL)

左子树所有节点值小于根节点值小于右子树所有节点值,左右子树高度差小于等于1,

why:使它的平均查找次数:以2为底的对数

四种调整

LL :A的左孩子的左子树插入节点导致不平衡

LR: A的左孩子的右子树插入节点导致不平衡

RR: A的右孩子的右子树插入节点导致不平衡

RL: A的右孩子的左子树插入节点导致不平衡

例子:

给出序列(5,8,9,3,2,4,7)构造平衡二叉树的过程

红黑树

B树

B+树

无向图

有向图:

邻接矩阵转无向图

邻接矩阵

在这里插入图片描述

做辅助判断有几个顶点

在这里插入图片描述

构建无向图

在这里插入图片描述

深度优先搜索随便写,个人习惯选择权重最小

例子

链栈结构

在链栈的实现中,我们通常需要一个指针来指向栈顶元素。考虑到这个需求,下面分析这三种结构的适用性:(1)带头节点的单链表:这种结构适合用于链栈。由于链栈通常需要在栈顶进行操作(如入栈、出栈),而头节点可以用来指向栈顶元素,这样可以方便地进行栈操作。另外,头节点不存储数据,可以作为一个哨兵节点,简化链表为空或满的判断条件。(2)不带头结点的循环单链表:这种结构也可以用于链栈,但是相对于带头节点的单链表,它实现起来更为复杂。因为循环链表的头结点就是栈顶元素,对于空栈的判断,以及插入和删除操作都需要更为复杂的指针操作。此外,如果链表为空,还需要特殊处理。(3)带头节点的双链表:双链表在插入和删除时,需要维护两个方向的指针,这会增加实现的复杂性。而且,对于链栈来说,通常只需要一个方向的链表就足够了(即只需要从栈顶到栈底的链表)。因此,使用双链表有些过于复杂,而且可能会浪费空间。综上所述,(1)带头节点的单链表是最适合用于链栈的存储结构。它的实现相对简单,而且能够方便地进行栈操作。

相关文章:

西南科技大学814考研二

C语言数据结构与算法 线性表 顺序表(静态分配内存) #include <stdio.h> #include <stdbool.h> //静态顺序表 #define MAX_SIZE 8 //顺序表储存的数据类型 typedef int ElemType; typedef struct {ElemType data[MAX_SIZE];int length; }SeqList; //初始化顺序表…...

oracle21c报错 【ORA-65096: 公用用户名或角色名无效】

1.数据库版本 oracle21c 2.问题提示 创建用户提示【ORA-65096: 公用用户名或角色名无效】 create user 自定义用户名 identified by 密码;--例:用户为test1&#xff0c;密码为123456 create user test1 identified by 123456;三.解决办法及结果 oracle11g之后的版本&#xff…...

C++ 递增/递减运算符重载

作用&#xff1a; 通过重载递增运算符&#xff0c;实现自己的整型数据 总结&#xff1a; 前置递增返回引用&#xff0c;后置递增返回值 递增 #include<iostream> using namespace std;class MyInteger { private:int m_Num 0; public:friend ostream& operator<…...

Android 13.0 无源码app增加授予相关权限

1.概述 在13.0的系统rom产品定制化开发中,对于一些无源码app增加一些权限,比如悬浮窗权限,由于app内部没申请这个权限, 所以需要系统适配默认授予这个权限,就需要在PMS解析安装app的时候 授予悬浮窗权限就可以了 2.无源码app增加授予相关权限的核心类 frameworks/base/cor…...

CI/CD相关概念学习

文章目录 CI/CD相关概念学习前言CI/CD相关概念介绍集成地狱持续集成持续交付持续部署Devops CI/CD相关应用介绍JenkinsTekton PipelinesSpinnakerTravis CIGoCD CI/CD相关概念学习 前言 本文主要是介绍一些 CI/CD 相关的概念&#xff0c;通过阅读本文你将快速了解 CI/CD 是什么…...

一、认识STM32

目录 一、初识STM32 1.1 STM32的命名规则介绍 1.2 STM32F103ZET6资源配置介绍 二、如何识别芯片管脚 2.1 如何寻找 IO 的功能说明 三、构成最小系统的要素 一、初识STM32 1.1 STM32的命名规则介绍 以 STM32F103ZET6 来讲解下 STM32 的命名方法&#xff1a; &…...

vue-router的编程式导航有哪些方法?

Vue Router 提供了几种编程式导航的方法&#xff0c;主要包括以下几种&#xff1a; router.push(location, onComplete?, onAbort?)&#xff1a;跳转到新的 URL&#xff0c;类似于 <router-link> 的 to 属性。可以指定路径或者命名的路由。 router.replace(location, …...

连接服务器上mysql数据库

1. 首先在服务器的安全组上设置开放3306端口&#xff08;默认是这个&#xff0c;有自定义可以酌情更改&#xff09; 2. 更改服务器上的数据库配置文件vi /etc/mysql/my.cnf 增加下面bind- address配置 [mysqld] bind-address0.0.0.0 3. 授予本地IP地址的主机连接权限 - 创建…...

IDEA 中设置 File Header 以及自定义类、方法注释模板的方法

目录 1 设置 File Header2 自定义类、方法注释生成类注解模板生成方法注解模板 1 设置 File Header File -> Settings -> File and Code Templates -> Includes -> File Header -> 编辑 2 自定义类、方法注释 File -> Settings -> Live Templates -&g…...

【数据结构】图的存储结构及实现(邻接表和十字链表)

一.邻接矩阵的空间复杂度 假设图G有n个顶点e条边&#xff0c;则存储该图需要O&#xff08;n^2) 不适用稀疏图的存储 二.邻接表 1.邻接表的存储思想&#xff1a; 对于图的每个顶点vi&#xff0c;将所有邻接于vi的顶点链成一个单链表&#xff0c;称为顶点vi的边表&#xff08…...

ROS Turtlebot3多机器人编队导航仿真

文章目录 前言一、Gzazebo中加载多台Turtlebot3机器人二、RVIZ中加载多个Turtlebot3机器人三.多机器人编队导航总结 前言 前面已经实现了在gazebo仿真环境中机器人一字型编队、三角形编队、N字型编队等仿真&#xff0c;接下来考虑多机器人编队在编队行进过程中的避障问题&…...

端口配置错误,导致RabbitMq启动报错

SpringBoot启动&#xff0c;报错如下&#xff1a; 2023-11-19 01:33:43.030 UID[] [] [AMQP Connection 116.xxx.xx.xxx:15672] ERROR com.rabbitmq.client.impl.ForgivingExceptionHandler - An unexpected connection driver error occured java.net.SocketException: Sock…...

<MySQL> 什么是JDBC?如何使用JDBC进行编程?

目录 一、JDBC是什么&#xff1f; 二、JDBC常用接口和类 2.1 DataSource 2.2 Connection 2.3 Statement 2.4 ResultSet 三、JDBC的使用 3.1 获得数据库驱动包 3.2 添加到项目依赖 3.3 描述数据库服务器 3.4 建立数据库连接 3.6 执行SQL语句和接收返回数据 3.7 释放…...

基于安卓android微信小程序的装修家装小程序

项目介绍 巧匠家装小程序的设计主要是对系统所要实现的功能进行详细考虑&#xff0c;确定所要实现的功能后进行界面的设计&#xff0c;在这中间还要考虑如何可以更好的将功能及页面进行很好的结合&#xff0c;方便用户可以很容易明了的找到自己所需要的信息&#xff0c;还有系…...

基于SSM的小区物业管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…...

c语言免杀火绒

文章目录 前记c加载器补充知识 前记 pyinstaller pyinstaller目前已经被杀疯了&#xff0c;简单打包一个hello a"hello" print(a)#pyinstaller -F -w b.py -n HipsMain.exe考虑Nuitka pip uninstall nuitka pip install nuitka pip install nuitka1.8.5 这里最新…...

MyBatis #{} 和 ${} 的区别

前言&#xff1a; #{} 和 ${} 的区别是 MyBatis 中一个常见的面试题&#xff0c;#{} 和 ${} 是MyBatis 中获取参数的两种方式&#xff0c;但我们在项目中大多数使用的都是 #{} 来获取参数&#xff0c;那么它们两个有什么区别呢&#xff1f; 区别 一. #{} 采用预编译 SQL&…...

计算机科学速成课

建议看看计算机科学速成课&#xff0c;一门很全面的计算机原理入门课程&#xff0c;短短10分钟可以把大学老师十几节课讲的东西讲清楚&#xff01;整个系列一共41个视频&#xff0c;B站上有中文字幕版。 每个视频都是一个特定的主题&#xff0c;例如软件工程、人工智能、操作系…...

基于单片机的汽车安全气囊系统故障仿真设计

**单片机设计介绍&#xff0c; 基于单片机微波炉加热箱系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的汽车安全气囊系统的故障检测系统是一种用于检测安全气囊系统故障的智能化设备&#xff0c;通过单片机控…...

JPA整合Sqlite解决Dialect报错问题, 最新版Hibernate6

前言 我个人项目中&#xff0c;不想使用太重的数据库&#xff0c;而内嵌数据库中SQLite又是最受欢迎的&#xff0c; 因此决定采用这个数据库。 可是JPA并不支持Sqlite&#xff0c;这篇文章就是记录如何解决这个问题的。 原因 JPA屏蔽了底层的各个数据库差异&#xff0c; 但是…...

算法通关村第十关-青铜挑战快速排序

大家好我是苏麟,今天带来快速排序 . 快速排序 单边快速排序(lomuto 洛穆托分区方案) 单边循环 (lomuto分区) 要点 : 选择最右侧元素作为基准点j 找比基准点小的&#xff0c;i 找比基准点大的&#xff0c;一旦找到&#xff0c;二者进行交换。 交换时机: 找到小的&#xff0c…...

whisper large-v3 模型文件下载链接

#源码里找到的_MODELS {"tiny.en": "https://openaipublic.azureedge.net/main/whisper/models/d3dd57d32accea0b295c96e26691aa14d8822fac7d9d27d5dc00b4ca2826dd03/tiny.en.pt","tiny": "https://openaipublic.azureedge.net/main/whisp…...

Ajax 之XMLHttpRequest讲解

一直以来都听别人说Ajax,今天终于接触到了。。。。。。。。。。 一.什么是Ajax? 答: AJAX即“Asynchronous Javascript And XML”&#xff08;异步JavaScript和XML&#xff09;&#xff0c;是指一种创建交互式网页应用的网页开发技术。 AJAX 异步 JavaScript和XML&#x…...

小程序里面循环使用ref的话获取不到

文章目录 概要问题案例解决方法 概要 在小程序里面一般循环使用ref的话会获取不到 问题案例 //这个时自己封装的组件&#xff0c;然后循环使用 <jilianXuanzhe huoqu"huoqu" :ref"jilianXuanzhe i"></jilianXuanzhe>//如果这样使用的话获取…...

PY32F002B从压缩包到实现串口printf输出

最近学习使用芯领的PY32F002B开发板&#xff0c;记录学习历程供有同样需求的人参考。 本文主要讲述利用开发板实现printf语句串口输出。 开发环境的初步搭建 官方提供了一个压缩文件&#xff0c;文件名py32f002B_231026.zip&#xff0c; 链接&#xff1a;https://pan.baidu.c…...

音视频项目—基于FFmpeg和SDL的音视频播放器解析(八)

介绍 在本系列&#xff0c;我打算花大篇幅讲解我的 gitee 项目音视频播放器&#xff0c;在这个项目&#xff0c;您可以学到音视频解封装&#xff0c;解码&#xff0c;SDL渲染相关的知识。您对源代码感兴趣的话&#xff0c;请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…...

CorelDRAW2024最新版本的图形设计软件

CorelDRAW2024是Corel公司推出的最新版本的图形设计软件。CorelDRAW是一款功能强大的矢量图形编辑工具&#xff0c;被广泛用于图形设计、插图、页面布局、照片编辑和网页设计等领域。 1. 新增的设计工具&#xff1a;CorelDRAW 2024引入了一些全新的设计工具&#xff0c;使用户能…...

【作业】操作系统实验一:进程和线程

文章目录 实验内容一、进程的创建1、编辑源程序2、编辑结果3、编译和运行程序4、解释运行结果 二、进程共享1、运行2、解释运行结果 三、进程终止1、运行2、解释运行结果 四、进程同步1、运行2、解释运行结果 五、Linux中子进程映像的重新装入1、运行2、解释运行结果 六、线程1…...

Linux 环境删除Conda

你可以按照以下步骤操作来删除Conda&#xff1a; 首先&#xff0c;停止所有conda环境。在终端中运行以下命令&#xff1a; conda deactivate然后使用以下命令获取conda安装的路径&#xff1a; which conda如果成功安装了conda&#xff0c;该命令输出的路径应该是类似于这样的&a…...

uni-app(1)pages. json和tabBar

第一步 在HBuilderX中新建项目 填写项目名称、确定目录、选择模板、选择Vue版本&#xff1a;3、点击创建 第二步 配置pages.json文件 pages.json是一个非常重要的配置文件&#xff0c;它用于配置小程序的页面路径、窗口表现、导航条样式等信息。 右键点击pages&#xff0c;按…...

window系统vscode 编译wvp前端代码

下载代码 wvp-GB28181-pro: WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的网络视频平台&#xff0c;负责实现核心信令与设备管理后台部分&#xff0c;支持NAT穿透&#xff0c;支持海康、大华、宇视等品牌的IPC、NVR、DVR接入。支持国标级联&#xff0c;支持rtsp/rtmp等…...

获取虎牙直播源

为了今天得LOL总决赛 然后想着下午看看 但是网页看占用高 就想起来有个直播源 也不复杂看了大概一个小时 没啥问题 进入虎牙页面只有 直接F12 网络 然后 看这个长条 一直在获取 发送 那就选中这个区间 找到都是数字这一条 如果直接访问的话会一直下载 我这都取消了 然后 打开…...

Halcon (2):Halcon基础知识

文章目录 文章专栏视频资源前言Halcon文档案例学习结论 文章专栏 Halcon开发 视频资源 机器视觉之C#联合Halcon 前言 本章我们主要讲解Halcon的基础语法 Halcon文档 按下F1&#xff0c;就可以看到Halcon的文档&#xff0c;不过都是纯英文的 如果不清楚参数如何使用&#x…...

测不准原理

测不准原理 算符的对易关系 commutation relation 测不准原理的矢量推导 Schwarz inequality: 设对易关系&#xff1a; 设一个新态&#xff1a; 投影&#xff1a; 那么有&#xff1a; 代回Schwarz inequality 即可证明&#xff1a;...

微机原理_12

一、单项选择题(本大题共15小题,每小题3分&#xff0c;共45分。在每小题给出的四个备选项中&#xff0c;选出一个正确的答案。〕 十进制正数56的 8位二进制补码是()。 A. 00011001 B. 10100110 C. 10011001 D. 00100110 若栈顶的物理地址为20100H&#xff0c;当执行完指令PUSH…...

设计模式(5)-使用设计模式实现简易版springIoc

自定义简易版springIoc 1 spring使用回顾 自定义spring框架前&#xff0c;先回顾一下spring框架的使用&#xff0c;从而分析spring的核心&#xff0c;并对核心功能进行模拟。 数据访问层。定义UserDao接口及其子实现类 public interface UserDao {public void add(); }public…...

数据结构与集合源码

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…...

nodejs+vue面向中小学课堂教学辅助软件系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

主要功能有&#xff0c;管理员通过后台会对此教学辅助进行审核&#xff0c;管理员在还可以进行首页、个人中心、学生管理、教师管理、班级信息管理、科目名称管理、课程信息管理、教学资料管理、作业信息管理、作业提交管理、作业成绩管理、在线考试管理、试题管理、考试管理、…...

智能配电系统解决方案

智能配电系统解决方案是一种集成了先进技术和智能化功能的配电系统&#xff0c;它能够提高电力系统的效率、可靠性和安全性。力安科技智能配电系统解决方案依托电易云-智慧电力物联网&#xff0c;具体实施的方案如下&#xff1a; 智能化设备和传感器&#xff1a;采用智能化的开…...

Python基础入门---conda 如何管理依赖包以及复制相同环境的

文章目录 创建虚拟环境:创建虚拟环境并指定Python版本:安装依赖包:从环境导出依赖包清单:从依赖包清单创建环境:复制环境:移植环境:在Conda中,你可以使用conda create命令来创建和管理虚拟环境,而使用conda install命令来安装和管理依赖包。以下是一些基本的命令和步骤…...

JVM jstat 查看内存新生代老年代回收情况,排查oom

jstat 命令 jstat - [-t] [-h] [ []] option&#xff1a;我们经常使用的选项有gc、gcutil vmid&#xff1a;java进程id interval&#xff1a;间隔时间&#xff0c;单位为毫秒 count&#xff1a;打印次数 每秒打印一次 jstat -gc 9162 1000S0C:年轻代第一个survivor的容量…...

Postman启动问题:Could not open Postman

Postman启动问题&#xff1a;Could not open Postman 状态&#xff0c;在单击Postman之后一直在转圈圈&#xff0c;无法正常启动。 细心的朋友会发现&#xff0c;右下角 会经常出现防火墙关闭等提示信息&#xff0c;表示该程序&#xff0c;在向外链接。 Error Could not open…...

Golang起步篇(Windows、Linux、mac三种系统安装配置go环境以及IDE推荐以及入门语法详细释义)

Golang起步篇 Golang起步篇一. 安装Go语言开发环境1. Wondows下搭建Go开发环境(1). 下载SDK工具包(2). 解压下载的压缩包&#xff0c;放到特定的目录下&#xff0c;我一般放在d:/programs下(路径不能有中文或者特殊符号如空格等)(3). 配置环境变量步骤1&#xff1a;先打开环境变…...

Error message “error:0308010C:digital envelope routines::unsupported“

1.降级到 Node.js v16。 您可以从 Node.js 的 website 重新安装当前的 LTS 版本。 您也可以使用 nvm。对于 Windows&#xff0c;请使用 nvm-windows。 2.启用传统 OpenSSL 提供程序。 在类 Unix 系统&#xff08;Linux、macOS、Git bash 等&#xff09;上&#xff1a; exp…...

解决java在idea运行正常,但是打成jar包后中文乱码问题

目录 比如&#xff1a; 打包命令使用utf-8编码&#xff1a; 1.当在idea中编写的程序,运行一切正常.但是当被打成jar包时,执行的程序会中文乱码.产生问题的原因和解决方案是什么呢? 一.问题分析 分别使用idea和jar包形式打印出System中所有的jvm参数---代码如下: public static…...

数据结构-插入排序+希尔排序+选择排序

目录 1.插入排序 插入排序的时间复杂度&#xff1a; 2.希尔排序 希尔排序的时间复杂度&#xff1a; 3.选择排序 选择排序的时间复杂度&#xff1a; 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的…...

微信小程序数据传递的方式-页面数据的存取

我们在把数据显示到页面的时候&#xff0c;为了实现良好的互动&#xff0c;都希望在用户点击某个栏目后&#xff0c;获取这个栏目的捆绑数据&#xff0c;然后执行后续的操作。 例如&#xff0c;从数据库里取出对应的记录后&#xff0c;显示在页面上&#xff0c;是一条条的大横条…...

Flutter 应用启动从闪屏页短暂黑屏再到第一个页面

由于应用初始状态启动会有白屏现象&#xff0c;便使用 flutter_native_splash 2.3.5 插件生成了启动相关的配置&#xff0c;并且按照示例使用了 import package:flutter_native_splash/flutter_native_splash.dart;void main() {WidgetsBinding widgetsBinding WidgetsFlutte…...

Linux+qt:获取.so自身的路径(利用dladdr)

目录 1、QDir::currentPath() 2、QAppllication::appllicationDirPath() 3、获取.so自身的路径&#xff08;利用dladdr&#xff09; Qt中&#xff0c;也有相关的接口获取程序的相关路径的。 先了解下相关的接口&#xff1a; 1、QDir::currentPath() &#xff08;1&#x…...

CSS特效014:模仿钟摆效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…...