双向链表初始化typedef struct node{ int data; struct node *prev,*next; }Node; Node* iniList() { Node *head(Node*)malloc(sizeof(Node)); head-data0; head-nextNULL; Head-prevNULL; return head; }头插法int insertHead(Node* L,int e) { Node *p(Node*)malloc(sizeof(Node)); p-datae; p-prevL; p-nextL-next; if(L-next!NULL) { L-next-prevp;//第三步 } L-nextp; return 1; }遍历void listNode(Node* L) { Node *pL-next; while(p!NULL) { printf(%d,p-data); pp-next;//易忘 } printf(\n); }尾插法//获取尾节点 Node *get_tail(Node *L) { Node *pL; while(p-next!NULL) { pp-next; } return p; } //尾插法 Node* insertTail(Node *tail,int e) { Node *p(Node*)malloc(sizeof(Node)); p-datae; p-prevtail; tail-nextp; p-nextNULL; return p; } main: tailinserttail(tail,10);在指定位置插入数字int insertNode(Node *L,int pos,int e) {//找到前驱节点 Node *pL; int i0; while(ipos-1) { pp-next; i; if(pNULL) { return 0; } } Node *q(Node*)malloc(sizeof(Node)); q-datae; q-prevp; q-nextp-next; p-next-prevq; p-nextq; return 1; }删除节点int deleteNode(Node *L,int pos) { Node *L; int i0; while(ipos-1) { pp-next; i; if(pNULL) { return 0; } } if(p-nextNULL) { printf( 要删除的位置错误\n); return 0; } Node *qp-next; p-nextq-next; free(q); return 1; }栈先进后出top栈顶指针 保存栈顶元素的下标值-1 空栈的顺序结构初始化判断栈是否为空进栈出栈e 为出栈的那个元素e地址 必须解引用*e获取栈顶元素动态内存分配 初始化栈的链式结构实现把链头做栈顶初始化判断栈是否为空进栈头插法出栈获取栈顶元素见VSC队列front 保存队头元素的下标值rear 保存的是队尾元素下标值的下一个位置的值队列的顺序结构实现初始化判断是否为空出队ElemType dequeue(Queue *Q) { if(Q-front Q-rear) { printf (空的\n); return 0; } ElemTYpe eQ-data[Q-front]; Q-front; return e; } //返回值为出对的元素入队int equeue(Queue *e, ElemType e) { if(Q-rear MAXSIZE) //可能满了 或者前面有空的 { if(!queueFull(Q)) //判断是否真的满了 函数返回1表示没满 后不进入这个if语句进行入队 { return 0; } Q-data[Q-rear]e; Q-rear; return 1; }场景1返回0场景二返回1front现在是3 3-30从三开始循环到6依次把数前移int queueFull(Queue *Q) { if(Q-front 0) //不是真的满了 { int stepQ-front; //front是几就挪几步 for(int iQ-front ; iQ-rear;i) { Q-data[i-step]Q-data[i]; } Q-front0; Q-rearQ-rear-step; return 1; } else { printf(真的满了\n); return 0; } }获取队头元素int getHead(Queue *Q,Elemtype *e) { if(Q-front Q-rear) { printf(空的\n); return 0; } *e Q-data[Q-front]; return 1; }动态内存分配循环队列入队int equeue(Queue *Q,ElemType e) { if((Q-reat1)%MAXSIZEQ-front) { printf(满了\n); return 0; } Q-data[Q-rear]e; Q-rear(Q-rear1)%MAXSIZE; return 1; }先都为0 后入队再出队一个后后入对一个此时01%81 front 判断此时满了就是说我们舍掉一个位置防止满和空的判断条件相同出队队列的链式结构初始化Queue* initQueue() { Queue *q(Queue*)malloc(sizeof(Queue)); //q里有front和rear Queuenode *node(Queuenode*)malloc(sizeof(QueueNode)); //初始化头节点 node-data0; node-nextNULL; q-frontnode;//front rear 都指向头节点 q-rearnode; return q; }判断队列是否为空int isEmpty(Queue *q) { if(q-front q-rear) { return 1; } else { return 0; } }入队尾插法出队删除头结点的next当删除的节点prearint dequeue (Queue *q,ElemType *e)//q储存 front rear e保存要出队的数据 { QueueNode *node q-front-next; //即p 要出队的节点 *enode -data; q-front-nextnode-next; //可能为同一个 if(q-rearnode) { q-rearq-front; //front rear指向头节点 } free(node); return 1; }获取队头元素双端队列