目录:
- 代码:
- 分析:
- 汇编:
代码:
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;
}
分析:
汇编: