日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

栈-线性表(代码、分析、汇编)

發(fā)布時(shí)間:2023/12/1 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 栈-线性表(代码、分析、汇编) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄:

    • 代碼:
    • 分析:
    • 匯編:

代碼:

LinkList.h

#ifndef _LINKLIST_H_ #define _LINKLIST_H_typedef void LinkList; //定義鏈表類型 typedef struct _tag_LinkListNode LinkListNode;//定義鏈表節(jié)點(diǎn)類型 struct _tag_LinkListNode {LinkListNode* next; };LinkList* LinkList_Create();void LinkList_Destroy(LinkList* list);void LinkList_Clear(LinkList* list);int LinkList_Length(LinkList* list);int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);LinkListNode* LinkList_Get(LinkList* list, int pos);LinkListNode* LinkList_Delete(LinkList* list, int pos);#endif

LinkList.c

#include <stdio.h> #include <malloc.h> #include "LinkList.h"typedef struct _tag_LinkList//定義實(shí)際使用鏈表類型 {LinkListNode header;//頭節(jié)點(diǎn)int length; } TLinkList;LinkList* LinkList_Create()//定義鏈表創(chuàng)建函數(shù) {TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));if( ret != NULL )//創(chuàng)建成功{ret->length = 0;ret->header.next = NULL;}return ret;//返回鏈表指針 }void LinkList_Destroy(LinkList* list) //定義鏈表銷毀函數(shù) {free(list); }void LinkList_Clear(LinkList* list)//定義鏈表清空重設(shè)函數(shù) {TLinkList* sList = (TLinkList*)list;if( sList != NULL )//鏈表不為空{sList->length = 0;sList->header.next = NULL;} }int LinkList_Length(LinkList* list) //定義獲取鏈表長度函數(shù) {TLinkList* sList = (TLinkList*)list;int ret = -1;if( sList != NULL )//鏈表不為空{ret = sList->length;}return ret; }int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) //定義插入節(jié)點(diǎn)函數(shù) { TLinkList* sList = (TLinkList*)list;int ret = (sList != NULL) && (pos >= 0) && (node != NULL);//判斷表不為空與pos正常與插入的節(jié)點(diǎn)不為空int i = 0;if( ret ){LinkListNode* current = (LinkListNode*)sList;//指向頭節(jié)點(diǎn)//找到新插入節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)//current->next ==NULL 表示 是第一個(gè)插入的節(jié)點(diǎn) 或 pos 大于當(dāng)前表長度就是插入到最后一個(gè)位置了for(i=0; (i<pos) && (current->next != NULL); i++){current = current->next;}node->next = current->next;//新插入節(jié)點(diǎn)的next等于本來在該位置的節(jié)點(diǎn)current->next = node;//新插入節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)的next等于新插入節(jié)點(diǎn)sList->length++;//長度增加}return ret; }LinkListNode* LinkList_Get(LinkList* list, int pos) //定義獲取節(jié)點(diǎn)函數(shù) {TLinkList* sList = (TLinkList*)list;LinkListNode* ret = NULL;int i = 0;if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )//判斷表不為空與pos是否在范圍內(nèi){LinkListNode* current = (LinkListNode*)sList;//指向頭節(jié)點(diǎn)for(i=0; i<pos; i++)//找到前一個(gè)節(jié)點(diǎn) {current = current->next;}ret = current->next;//取得獲取節(jié)點(diǎn)}return ret; }LinkListNode* LinkList_Delete(LinkList* list, int pos) //定義刪除節(jié)點(diǎn)函數(shù) {TLinkList* sList = (TLinkList*)list;LinkListNode* ret = NULL;int i = 0;if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )//判斷表不為空與pos是否在范圍內(nèi){LinkListNode* current = (LinkListNode*)sList;//指向頭節(jié)點(diǎn)for(i=0; i<pos; i++)//找到刪除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn){current = current->next;}ret = current->next;//取得刪除節(jié)點(diǎn)current->next = ret->next;//將刪除節(jié)點(diǎn)前一個(gè)節(jié)點(diǎn)的next指向刪除節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)sList->length--;//長度減少}return ret; }

LinkStack.h

#ifndef _LINKSTACK_H_ #define _LINKSTACK_H_typedef void LinkStack;//定義棧類型LinkStack* LinkStack_Create();//聲明創(chuàng)建棧函數(shù)void LinkStack_Destroy(LinkStack* stack);//聲明銷毀棧函數(shù)void LinkStack_Clear(LinkStack* stack);//聲明清空棧函數(shù)int LinkStack_Push(LinkStack* stack, void* item);//聲明添加數(shù)據(jù)進(jìn)棧函數(shù)void* LinkStack_Pop(LinkStack* stack);//聲明取出數(shù)據(jù)出棧函數(shù)void* LinkStack_Top(LinkStack* stack);//聲明獲取棧頂數(shù)據(jù)函數(shù)不移除節(jié)點(diǎn)int LinkStack_Size(LinkStack* stack);//聲明獲取棧當(dāng)前大小函數(shù)#endif

LinkStack.c

#include<stdio.h> #include <malloc.h> #include "LinkStack.h" #include "LinkList.h"//注意: 該棧只給鏈表套多一層調(diào)用線性鏈表的函數(shù)typedef struct _tag_LinkStackNode//定義棧節(jié)點(diǎn)類型 {//注意 :棧只是將在鏈表的模式下的節(jié)點(diǎn)的信息封裝在該文件了,不在main.c定義了LinkListNode header;//頭節(jié)點(diǎn) void* item;//指向插入數(shù)據(jù)的地址 } TLinkStackNode;LinkStack* LinkStack_Create()//定義創(chuàng)建棧函數(shù) {return LinkList_Create();//調(diào)用鏈表創(chuàng)建函數(shù)一個(gè)鏈表 }void LinkStack_Destroy(LinkStack* stack)//定義銷毀棧函數(shù) {LinkStack_Clear(stack);//先清空棧內(nèi)數(shù)據(jù)LinkList_Destroy(stack);//再調(diào)用鏈表銷毀函數(shù),銷毀該鏈表 }void LinkStack_Clear(LinkStack* stack)//定義清空棧函數(shù) {while( LinkStack_Size(stack) > 0 )//如果棧內(nèi)還有數(shù)據(jù)全部取出來{LinkStack_Pop(stack);} }//第二個(gè)參數(shù)是傳進(jìn)來是變量地址 int LinkStack_Push(LinkStack* stack, void* item)//定義添加數(shù)據(jù)進(jìn)棧函數(shù) { //注意:這個(gè)節(jié)點(diǎn)是動(dòng)態(tài)添加,不用時(shí)要釋放內(nèi)存TLinkStackNode* node = (TLinkStackNode*)malloc(sizeof(TLinkStackNode));//申請(qǐng)新創(chuàng)一個(gè)節(jié)點(diǎn)int ret = (node != NULL) && (item != NULL);//判斷是否創(chuàng)建成功與插入數(shù)據(jù)是否正常if( ret ){node->item = item;//將傳來的變量地址給新創(chuàng)建的節(jié)點(diǎn)存放的數(shù)據(jù)賦值//插入鏈表第一個(gè)位置,到時(shí)取出就取第一個(gè)位置,實(shí)現(xiàn)先進(jìn)后出ret = LinkList_Insert(stack, (LinkListNode*)node, 0);}if( !ret )//如果插入不成功{free(node);//將剛申請(qǐng)的節(jié)點(diǎn)空間釋放}return ret; }void* LinkStack_Pop(LinkStack* stack)//定義取出數(shù)據(jù)出棧函數(shù) {//調(diào)用鏈表刪除函數(shù) 第一個(gè)位置的節(jié)點(diǎn),因?yàn)闀?huì)返回刪除節(jié)點(diǎn)TLinkStackNode* node = (TLinkStackNode*)LinkList_Delete(stack, 0);void* ret = NULL;if( node != NULL )//如果成功 ,表示棧內(nèi)還有元素{ret = node->item;//取得節(jié)點(diǎn)內(nèi)數(shù)據(jù)地址free(node);//釋放該節(jié)點(diǎn)}return ret;//返回節(jié)點(diǎn)內(nèi)的數(shù)據(jù)地址 }void* LinkStack_Top(LinkStack* stack)//定義獲取棧頂數(shù)據(jù)函數(shù)不移除節(jié)點(diǎn) {TLinkStackNode* node = (TLinkStackNode*)LinkList_Get(stack, 0);void* ret = NULL;if( node != NULL )//如果成功 ,表示棧內(nèi)還有元素{ret = node->item;//取得節(jié)點(diǎn)內(nèi)數(shù)據(jù)地址}//注意:沒有釋放移除節(jié)點(diǎn)的,節(jié)點(diǎn)還在return ret;//返回節(jié)點(diǎn)內(nèi)的數(shù)據(jù)地址 }int LinkStack_Size(LinkStack* stack)//定義獲取棧當(dāng)前大小函數(shù) {return LinkList_Length(stack); }

main.c

#include <stdio.h> #include <stdlib.h> #include "LinkStack.h"int main(int argc, char *argv[]) {LinkStack* stack = LinkStack_Create();int a[10];int i = 0;for(i=0; i<10; i++){a[i] = i;LinkStack_Push(stack, a + i);}printf("Top: %d\n", *(int*)LinkStack_Top(stack));printf("Length: %d\n", LinkStack_Size(stack));while( LinkStack_Size(stack) > 0 ){printf("Pop: %d\n", *(int*)LinkStack_Pop(stack));}LinkStack_Destroy(stack);getchar();return 0; }

分析:









匯編:







總結(jié)

以上是生活随笔為你收集整理的栈-线性表(代码、分析、汇编)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。