#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct value
{
LinkListNode* next;
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,0);
LinkList_Insert(list,(LinkListNode*)&v2,0);
LinkList_Insert(list,(LinkListNode*)&v3,0);
LinkList_Insert(list,(LinkListNode*)&v4,0);
LinkList_Insert(list,(LinkListNode*)&v5,0);
for(i=0;i<LinkList_Length(list);i++)
{
struct value*pv=(struct value*)LinkList_Get(list,i);
printf("%d\n",pv->v);
}
printf("\n");
while(LinkList_Length(list)>0)
{
struct value* pv=(struct value*)LinkList_Delete(list,0);
printf("%d\n",pv->v);
}
printf("\nafter Delete!\n");
for(i=0;i<LinkList_Length(list);i++)
{
struct value*pv=(struct value*)LinkList_Get(list,i);
printf("%d\n",pv->v);
}
LinkList_Destroy(list);
return 0;
}
#include <stdio.h>
#include "LinkList.h"
#include <malloc.h>
typedef struct _tag_LinkList
{
LinkListNode header;
int length;
}TLinkList;
//头结点的定义,里面包括一个指向单链表的头指针,和表示单链表信息的数据
/****************************
/功能:创建一个单链表,实际上是将头结点创建出来,给头结点分配内存空间,这个空间里面有
/一个头结点指针,它通过后面的Insert函数,将这个指针指向main中已经分配好内存的数据节点结构体的地址
/struct value v
/每次插入都会将相应的数据域节点结构的 地址关联起来,所以实际上创建出头结点即可,
/头结点关联起各个数据域节点之间的关系
/返回值:TLinkList* 头结点的地址
/***************************/
LinkList* LinkList_Create()
{
TLinkList*ret=(TLinkList*)malloc(sizeof(TLinkList));
if(ret!=NULL)
{
ret->header.next=NULL;
ret->length=0;
}
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)
{
int ret=-1;
TLinkList* sList=(TLinkList*)list;
if(sList!=NULL)
{
ret=sList->length;
}
return ret;
}
/*********************************************
/功能:在单链表下标pos的位置插入一个数据元素节点node
/参数:要插入链表的地址list,要插入节点的地址node,位置pos
/返回值,int
/
***********************************************/
int LinkList_Insert(LinkList* list,LinkListNode* node,int pos)
{
int flag;
//强制类型转换,将void* 地址转换成 头结点型
TLinkList* sList=(TLinkList*)list;
flag=((sList!=NULL)&&(node!=NULL)&&(0<=pos));
if(flag)
{
//获取当前节点,需强制类型转换
LinkListNode* current=(LinkListNode*)sList;
int i=0;
//找到pos-1的位置
for(i=0;(i<pos)&¤t->next!=NULL;i++)
{
current=current->next;
}
node->next=current->next;
current->next=node;
sList->length++;
}
return flag;
}
/*********************************************
/功能:在单链表下标pos的位置删除一个数据元素节点node
/参数:要插入链表的地址list,要插入节点的地址node,位置pos
/返回值:返回删除的节点的地址,LinkListNode*
/
***********************************************/
LinkListNode* LinkList_Delete(LinkList* list,int pos)
{
TLinkList* sList=(TLinkList*)list;
LinkListNode* ret=NULL;
if((sList!=NULL)&&(pos>=0)&&(pos<sList->length))
{
LinkListNode* current=(LinkListNode*)sList;
int i=0;
for(i=0;i<pos;i++)
{
current=current->next;
}
ret=current->next;
current->next=ret->next;
sList->length--;
}
return ret;
}
LinkListNode* LinkList_Get(LinkList* list,int pos)
{
TLinkList* sList=(TLinkList*)list;
LinkListNode* ret=NULL;
if((sList!=NULL)&&(pos>=0)&&(pos<sList->length))
{
LinkListNode* current=(LinkListNode*)sList;
int i=0;
for(i=0;i<pos;i++)
{
current=current->next;
}
ret=current->next;
}
return ret;
}
#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_Delete(LinkList* list,int pos);
LinkListNode* LinkList_Get(LinkList* list,int pos);
#endif
数据结构--单链表的实现
最新推荐文章于 2024-07-26 11:13:55 发布