资讯动态

Day3 数据结构(3)

发布时间:2026/8/18 9:43:56 来源:尧图企业网站定制
今天不对是昨天学习了数据结构的双向链表双向循环链表以及顺序栈链表栈还有队列学习中主要有以下几点问题1.在练习双向链表的操作中的删除操作时最开始不理解指针的赋值和指向含义导致我每次以为指针一直是指向结果是赋值操作让下一个的pPre指向前一个就是赋值但是单独拿出来说就是pPre指向前一个节点所以这两个在指针中还是有很强的迷惑性的。2.我觉得在学习中还是要多画一下结构图结合代码一块看就相对容易理解一点硬啃代码迟早会绕晕的3.单向链表是学习整个链表的基础而顺序栈的操作跟顺序表很像链表栈又跟链表很像先进后出其实入栈就是在加入链表元素的时候用头插法出栈就是每次将数据返回后将空间释放掉但是头节点不能释放掉队列就像排队一样讲究先来后到先进先出。4.下面是一些双向链表的操作#includedoulist.h #includestdio.h #includestdlib.h #includestring.h Node_t *CreatEmptyDouList(void) { Node_t *TempNode NULL; TempNode malloc(sizeof(Node_t)); if(TempNode NULL) { printf(malloc failed\n); return NULL; } TempNode-pNext NULL; TempNode-pPre NULL; return TempNode; } int InsertHeadDouList(Node_t *pTempList,DataType TempData) { Node_t *pTempNode NULL; pTempNode malloc(sizeof(Node_t)); if(pTempNode NULL) { printf(malloc failed\n); return -1; } pTempNode-Data TempData; pTempNode-pNext pTempList-pNext; pTempNode-pPre pTempList; pTempNode-pPre-pNext pTempNode; if(pTempNode-pNext ! NULL) { pTempNode-pNext-pPre pTempNode; } return 0; } int ShowDouList(Node_t *pTempList) { Node_t *pTempNode NULL; pTempNode pTempList-pNext; while(pTempNode ! NULL) { printf(%d ,pTempNode-Data); pTempNode pTempNode-pNext; } printf(\n); return 0; } int DeleteDouList(Node_t *pTempList,DataType TempData) { Node_t *pTempNode NULL; Node_t *pFreeNode NULL; int cnt 0; pTempNode pTempList-pNext; while(pTempNode ! NULL) { if(pTempNode-Data TempData) { pTempNode-pPre-pNext pTempNode-pNext; if(pTempNode-pNext ! NULL) { pTempNode-pNext-pPre pTempNode-pPre; } pFreeNode pTempNode; pTempNode pTempNode-pNext; free(pFreeNode); pFreeNode NULL; cnt; } else { pTempNode pTempNode-pNext; } } return cnt ; }5.下面是顺序栈的一些操作#include seqstack.h #include stdio.h #include string.h #include stdlib.h Stack_t *CreateSeqStack(int Len) { Stack_t *pTmpStack NULL; //1.申请标签空间 pTmpStack malloc(sizeof(Stack_t)) ; //2.对标签元素赋值 pTmpStack-tLen Len; pTmpStack-Top 0; //3.申请存放数据的空间 pTmpStack-pData malloc(Len * sizeof(DataType)); return pTmpStack; } int IsEmptySeqStack(Stack_t *pTmpStack) { //1.返回clen 0 return pTmpStack-Top 0 ? 1:0; } int IsFullSeqStack(Stack_t *pTmpStack) { //1.返回tlen clen return (pTmpStack-tLen pTmpStack-Top) ? 1:0; } int PushSeqStack(Stack_t *pTmpStack, DataType TmpData) { if(IsFullSeqStack(pTmpStack)) { return -1; } //1.将数据存放在栈针对应的位置 pTmpStack-pData[pTmpStack-Top] TmpData; //2.栈针 pTmpStack-Top; return 0; } DataType PopSeqStack(Stack_t *pTmpStack) { if(IsEmptySeqStack(pTmpStack)) { return -1; } //1.栈针-- (pTmpStack-Top)--; //2.返回栈顶元素 return pTmpStack-pData[pTmpStack-Top]; } int DestroySeqStack(Stack_t **ppTmpStack) { //1.释放存放数据的空间 free((*ppTmpStack)-pData); (*ppTmpStack)-pData NULL; //2.释放存放标签的空间 free(*ppTmpStack); *ppTmpStack NULL; return 0; }6.下面是链式栈的一些操作#includelinkstack.h #includestdio.h #include string.h #include stdlib.h Node_t *CreateLinkStack(void) { //1.申请空白节点 Node_t *pTmpNode NULL; pTmpNode malloc(sizeof(Node_t)); if(pTmpNode NULL) { printf(malloc failed\n); return NULL; } //2.空白节点的pNext赋值 pTmpNode-pNext NULL; //3.返回空白节点的地址 return pTmpNode; } int IsEmptyLinkStack(Node_t *pTmpStack) { return pTmpStack-pNext NULL ? 1:0; } int PushLinkStack(Node_t *pTmpStack, DataType TmpData) { //1.申请空间 Node_t *pTmpNode NULL; pTmpNode malloc(sizeof(Node_t)); if(pTmpNode NULL) { printf(malloc failed\n); return -1; } //2.按照头插法完成节点插入 pTmpNode-Data TmpData; pTmpNode-pNext pTmpStack-pNext; pTmpStack-pNext pTmpNode; return 0; } DataType PopLinkStack(Node_t *pTmpStack) { DataType TempData 0; Node_t *pTmpNode NULL; Node_t *pFreeNode NULL; pFreeNode pTmpNode pTmpStack-pNext; //1.判断栈是否为空 if(IsEmptyLinkStack(pTmpStack)) { return -1; } //2.移除空白节点的后一个节点 TempData pTmpNode-Data; pTmpNode pTmpNode-pNext; free(pFreeNode); pTmpStack-pNext pTmpNode; return TempData; //3.获得节点的数据 //4.销毁节点 //5.返回数据值 } int DestroyLinkStack(Node_t **ppTmpStack) { Node_t *pTmpNode1 NULL; Node_t *pTmpNode2 NULL; pTmpNode2 pTmpNode1 *ppTmpStack; while(pTmpNode1 ! NULL) { pTmpNode1 pTmpNode1-pNext; free(pTmpNode2); pTmpNode2 pTmpNode1; } *ppTmpStack NULL; return 0; }7.下面是链式队列的一些操作#includelinkqueue.h #includestdio.h #includestring.h #includestdlib.h Node_t *CreatEmptyLinkQueue(void) { Node_t *pTempNode NULL; pTempNode malloc(sizeof(Node_t)); if(pTempNode NULL) { printf(malloc failed\n); return NULL; } pTempNode-pNext NULL; return pTempNode; } int IsEmptyLinkQueue(Node_t *pTempQueue) { return pTempQueue-pNext NULL ? 1:0; } int EnterQueue(Node_t *pTempQueue,DataType TempData) { Node_t *pTempNode NULL; pTempNode malloc(sizeof(Node_t)); if(pTempNode NULL) { printf(malloc failed\n); return -1; } pTempNode-Data TempData; while(pTempQueue-pNext ! NULL) { pTempQueue pTempQueue-pNext; } pTempNode-pNext pTempQueue-pNext; pTempQueue-pNext pTempNode; return 0; } DataType DeleteQueue(Node_t *pTempQueue) { Node_t *pTempNode NULL; Node_t *pFreeNode NULL; DataType TempData; if(IsEmptyLinkQueue(pTempQueue)) { return -1; } pFreeNode pTempNode pTempQueue-pNext; TempData pTempNode-Data; pTempNode pTempNode-pNext; pTempQueue-pNext pTempNode; free(pFreeNode); pFreeNode pTempNode; return TempData; } int DestoryLinkQueue(Node_t **ppTempQueue) { Node_t *pTempNode NULL; Node_t *pFreeNode NULL; pTempNode pFreeNode *ppTempQueue; while(pTempNode ! NULL) { pTempNode pTempNode-pNext; free(pFreeNode); pFreeNode pTempNode; } *ppTempQueue NULL; return 0; }对于我的收获我觉得对数据结构又有了更深的认识并且在指针操作上逐渐熟悉以前不知道指针怎么使用现在可以明白指针的用法及代码中的含义还有就是可以自己独立写出一些数据结构的操作。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价