目錄:
- 代碼:
- 分析:
- 匯編:
代碼:
LinkList.h
#ifndef _LINKLIST_H_
#define _LINKLIST_H_typedef void LinkList; //定義鏈表類型
typedef struct _tag_LinkListNode LinkListNode;//定義鏈表節點類型
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//定義實際使用鏈表類型
{LinkListNode header;//頭節點int length;
} TLinkList;LinkList* LinkList_Create()//定義鏈表創建函數
{TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));if( ret != NULL )//創建成功{ret->length = 0;ret->header.next = NULL;}return ret;//返回鏈表指針
}void LinkList_Destroy(LinkList* list) //定義鏈表銷毀函數
{free(list);
}void LinkList_Clear(LinkList* list)//定義鏈表清空重設函數
{TLinkList* sList = (TLinkList*)list;if( sList != NULL )//鏈表不為空{sList->length = 0;sList->header.next = NULL;}
}int LinkList_Length(LinkList* list) //定義獲取鏈表長度函數
{TLinkList* sList = (TLinkList*)list;int ret = -1;if( sList != NULL )//鏈表不為空{ret = sList->length;}return ret;
}int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) //定義插入節點函數
{ TLinkList* sList = (TLinkList*)list;int ret = (sList != NULL) && (pos >= 0) && (node != NULL);//判斷表不為空與pos正常與插入的節點不為空int i = 0;if( ret ){LinkListNode* current = (LinkListNode*)sList;//指向頭節點//找到新插入節點的前一個節點//current->next ==NULL 表示 是第一個插入的節點 或 pos 大于當前表長度就是插入到最后一個位置了for(i=0; (i<pos) && (current->next != NULL); i++){current = current->next;}node->next = current->next;//新插入節點的next等于本來在該位置的節點current->next = node;//新插入節點的前一個節點的next等于新插入節點sList->length++;//長度增加}return ret;
}LinkListNode* LinkList_Get(LinkList* list, int pos) //定義獲取節點函數
{TLinkList* sList = (TLinkList*)list;LinkListNode* ret = NULL;int i = 0;if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )//判斷表不為空與pos是否在范圍內{LinkListNode* current = (LinkListNode*)sList;//指向頭節點for(i=0; i<pos; i++)//找到前一個節點 {current = current->next;}ret = current->next;//取得獲取節點}return ret;
}LinkListNode* LinkList_Delete(LinkList* list, int pos) //定義刪除節點函數
{TLinkList* sList = (TLinkList*)list;LinkListNode* ret = NULL;int i = 0;if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )//判斷表不為空與pos是否在范圍內{LinkListNode* current = (LinkListNode*)sList;//指向頭節點for(i=0; i<pos; i++)//找到刪除節點的前一個節點{current = current->next;}ret = current->next;//取得刪除節點current->next = ret->next;//將刪除節點前一個節點的next指向刪除節點的下一個節點sList->length--;//長度減少}return ret;
}
LinkStack.h
#ifndef _LINKSTACK_H_
#define _LINKSTACK_H_typedef void LinkStack;//定義棧類型LinkStack* LinkStack_Create();//聲明創建棧函數void LinkStack_Destroy(LinkStack* stack);//聲明銷毀棧函數void LinkStack_Clear(LinkStack* stack);//聲明清空棧函數int LinkStack_Push(LinkStack* stack, void* item);//聲明添加數據進棧函數void* LinkStack_Pop(LinkStack* stack);//聲明取出數據出棧函數void* LinkStack_Top(LinkStack* stack);//聲明獲取棧頂數據函數不移除節點int LinkStack_Size(LinkStack* stack);//聲明獲取棧當前大小函數#endif
LinkStack.c
#include<stdio.h>
#include <malloc.h>
#include "LinkStack.h"
#include "LinkList.h"//注意: 該棧只給鏈表套多一層調用線性鏈表的函數typedef struct _tag_LinkStackNode//定義棧節點類型
{//注意 :棧只是將在鏈表的模式下的節點的信息封裝在該文件了,不在main.c定義了LinkListNode header;//頭節點 void* item;//指向插入數據的地址
} TLinkStackNode;LinkStack* LinkStack_Create()//定義創建棧函數
{return LinkList_Create();//調用鏈表創建函數一個鏈表
}void LinkStack_Destroy(LinkStack* stack)//定義銷毀棧函數
{LinkStack_Clear(stack);//先清空棧內數據LinkList_Destroy(stack);//再調用鏈表銷毀函數,銷毀該鏈表
}void LinkStack_Clear(LinkStack* stack)//定義清空棧函數
{while( LinkStack_Size(stack) > 0 )//如果棧內還有數據全部取出來{LinkStack_Pop(stack);}
}//第二個參數是傳進來是變量地址
int LinkStack_Push(LinkStack* stack, void* item)//定義添加數據進棧函數
{ //注意:這個節點是動態添加,不用時要釋放內存TLinkStackNode* node = (TLinkStackNode*)malloc(sizeof(TLinkStackNode));//申請新創一個節點int ret = (node != NULL) && (item != NULL);//判斷是否創建成功與插入數據是否正常if( ret ){node->item = item;//將傳來的變量地址給新創建的節點存放的數據賦值//插入鏈表第一個位置,到時取出就取第一個位置,實現先進后出ret = LinkList_Insert(stack, (LinkListNode*)node, 0);}if( !ret )//如果插入不成功{free(node);//將剛申請的節點空間釋放}return ret;
}void* LinkStack_Pop(LinkStack* stack)//定義取出數據出棧函數
{//調用鏈表刪除函數 第一個位置的節點,因為會返回刪除節點TLinkStackNode* node = (TLinkStackNode*)LinkList_Delete(stack, 0);void* ret = NULL;if( node != NULL )//如果成功 ,表示棧內還有元素{ret = node->item;//取得節點內數據地址free(node);//釋放該節點}return ret;//返回節點內的數據地址
}void* LinkStack_Top(LinkStack* stack)//定義獲取棧頂數據函數不移除節點
{TLinkStackNode* node = (TLinkStackNode*)LinkList_Get(stack, 0);void* ret = NULL;if( node != NULL )//如果成功 ,表示棧內還有元素{ret = node->item;//取得節點內數據地址}//注意:沒有釋放移除節點的,節點還在return ret;//返回節點內的數據地址
}int LinkStack_Size(LinkStack* stack)//定義獲取棧當前大小函數
{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;
}
分析:
匯編: