目錄:
- 代碼:
- 分析:
- 匯編:
代碼:
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; //指向頭節點for(i=0; (i<pos) && (current->next != NULL); i++)//找到插入位置節點的前一個節點{current = current->next;}node->next = current->next; //新節點的next指向插入位置前一個節點的nextcurrent->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;
}
lmain.c
#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"struct Value
{LinkListNode header;int v;
};int main(int argc, char *argv[])
{int i = 0;LinkList* list = LinkList_Create();struct Value v1;struct Value v2;struct Value v3;struct Value v4;struct Value v5;v1.v = 1;v2.v = 2;v3.v = 3;v4.v = 4;v5.v = 5;LinkList_Insert(list, (LinkListNode*)&v1, LinkList_Length(list));LinkList_Insert(list, (LinkListNode*)&v2, LinkList_Length(list));LinkList_Insert(list, (LinkListNode*)&v3, LinkList_Length(list));LinkList_Insert(list, (LinkListNode*)&v4, LinkList_Length(list));LinkList_Insert(list, (LinkListNode*)&v5, LinkList_Length(list));FILE* fp = fopen("ad.dat", "wb");fwrite(list, sizeof(LinkList*), 1, fp);fclose(fp);/* for(i=0; i<LinkList_Length(list); i++){struct Value* pv = (struct Value*)LinkList_Get(list, i);printf("%d\n", pv->v);}while( LinkList_Length(list) > 0 ){struct Value* pv = (struct Value*)LinkList_Delete(list, 0);printf("%d\n", pv->v);}*/LinkList_Destroy(list);getchar();return 0;
}
分析:
匯編: