数据结构与算法
1.线性表
// 线性表的顺序存储结构// 静态分配#include <stdio.h>/* 存储空间初始分配量 */#define MAXSIZE 10typedef struct { int data[MAXSIZE]; int length;} SqList;// 初始化void InitList(SqList &L) { for (int i=0; i<MAXSIZE; i++) { L.data[i] = 0; } L.length = MAXSIZE;}// 插入元素bool ListInsert(SqList &L, int i, int e) { if (i<1 || i>L.length+1) { return false; } if (L.length > MAXSIZE) { return false; } for (int j = L.length; j >= i; j--) { L.data[j] = L.data[j-1]; // 将第i个元素及其以后的元素后移 } L.data[i-1] = e; L.length++; return true;}// 删除元素bool ListDelete(SqList &L, int i, int &e) { if (i<1 || i>L.length) { return false; } e = L.data[i-1]; // 被删除的元素赋值给e for (int j = i; j <= L.length; j++) { L.data[j-1] = L.data[j]; // 将第i个位置以及以后前移 } L.length++; return true;}void printList(SqList &l) { for (int i = 0; i < l.length; i++) { printf("list:%d,%d\n", i, l.data[i]); } printf("length=%d\n", l.length);}int main(int argc, char const *argv[]) { SqList l; InitList(l); printList(l); ListInsert(l, 1, 1); printList(l); ListInsert(l, 2, 2); printList(l); int e = -1; if (ListDelete(l, 1, e)) { printf("删除第1个元素成功,值为%d\n", e); printList(l); } else { printf("删除失败\n"); } return 0;}
// 顺序表的动态分配#include <stdio.h>#include <stdlib.h>#define InitSize 10typedef struct { int *data; // 动态分配数组的指针 int MaxSize; // 最大容量 int length; // 当前长度} SqList;// 初始化void initList(SqList &l) { // 用malloc申请连续内存,data表示首地址 l.data = (int *)malloc(InitSize*sizeof(int)); l.length = 0; l.MaxSize = InitSize;}// 动态增加数组长度void increaseSize(SqList &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; free(p);}int main(int argc, char const *argv[]){ SqList l; initList(l); increaseSize(l, 5); return 0;}
// 带头结点的单链表#include <stdlib.h>typedef int ElemType;typedef struct LNode{ ElemType data; struct LNode *next;} LNode, *LinkList;// 初始化bool InitList(LinkList &l) { l = (LNode *)malloc(sizeof(LNode)); // 分配一个头结点 if (l == NULL) { return false; } l->next = NULL; return true;}bool isEmpty(LinkList &l) { if (l->next == NULL) { return true; } return false;}
// 双向链表#include <stdio.h>#include <stdlib.h>typedef int ElemType;typedef struct DNode { ElemType data; struct DNode *prior, *next;} DNode, *DLinkList;// 初始化bool InitDLinkList(DLinkList &l) { l = (DNode *)malloc(sizeof(DNode)); // 分配头节点 if (l == NULL) { return false; } l->prior = NULL; l->next = NULL; return true;}// 在p节点后插入s节点bool InsertNextDNode(DNode *p, DNode *s) { if (p == NULL || s == NULL) { return false; } s->next = p->next; // 将p的后继节点设置为s的后继节点 if (p->next != NULL) // 如果p有后继节点 { // 将p的后继节点的上一个设置为s p->next->prior = s; } s->prior = p; p->next = s;}// 删除p节点的后继节点bool DeleteNextDNode(DNode *p) { if (p == NULL) { return false; } DNode *q = p->next; if (q == NULL) { return false; } p->next = q->next; if (q->next != NULL) { q->next->prior = p; } free(q); return true;}int main(int argc, char const *argv[]){ DLinkList l; bool ret = InitDLinkList(l); if (ret) { printf("初始化成功\n"); } else { printf("初始化失败\n"); } return 0;}
2.栈
// 栈(数组实现)#include <stdio.h>#define MaxSize 10typedef struct { int data[MaxSize]; int top;} SqStack;// 初始化void InitStack(SqStack &s) { s.top = -1;}bool IsEmpty(SqStack &s) { if (s.top == -1) { return true; } return false;}// 入栈bool push(SqStack &s, int &x) { // 栈已满 if (s.top == MaxSize - 1) { return false; } s.top++; s.data[s.top] = x; return true;}// 出栈bool pop(SqStack &s) { if (s.top == -1) { return false; } int x = s.data[s.top]; printf("pop stack, value=%d\n", x); s.top--; return true;}int main(int argc, char const *argv[]){ SqStack stack; InitStack(stack); int x = 1; push(stack, x); pop(stack); return 0;}
/** 检查括号是否成对出现,且没有交叉 */#include <stdio.h>#include <stdlib.h>#include <string.h>#define MaxSize 10// 定义栈typedef struct { char data[MaxSize]; int top;} SqStack;// 初始化void initStack(SqStack &s) { s.top = -1;}// 是否空bool isEmpty(SqStack &s) { if (s.top == -1) { return true; } return false;}// 入栈bool push(SqStack &s, char x) { if (s.top == MaxSize-1) { return false; } s.top++; s.data[s.top] = x; return true;}// 出栈,用x返回bool pop(SqStack &s, char &x) { if (s.top == -1) { return false; } x = s.data[s.top]; s.top--; return true;}bool bracketCheck(char str[]) { SqStack s; initStack(s); int length = strlen(str); printf("str length is %d\n", length); for (int i = 0; i < length; i++) { if (str[i] == '(' || str[i] == '[' || str[i] == '{') { push(s, str[i]); // 左括号则入栈 } else { // 右括号检查,如果栈空,则失败 if (isEmpty(s)) return false; char topElem; pop(s, topElem); // 栈顶元素出栈 if (str[i] == ')' && topElem != '(') { return false; } if (str[i] == ']' && topElem != '[') { return false; } if (str[i] == '}' && topElem != '{') { return false; } } } return isEmpty(s);}int main(int argc, char const *argv[]){ char ss[] = "([])["; bool ret = bracketCheck(ss); if (ret) { printf("检查成功"); } else { printf("检查失败"); } return 0;}