#ifndef _LINK_LIST_H_
#define _LINK_LIST_H_
/************************************************************************/
/* 线性表链式存储结构实现 --单链表 */
/************************************************************************/
typedef struct FLinkNode
{
ElemType data;
FLinkNode* Next;
}FLinkNode;
//单向链表数据结构定义
typedef FLinkNode* LinkList;
/**初始化操作,建立一个空的线性表L。*/
Status InitList(LinkList* L);
/**采用头插法初始化链表,建立一个包含n个元素的线性表L。*/
Status CreateListHead(LinkList* L , int n);
/**采用尾插法初始化链表,建立一个包含n个元素的线性表L。*/
Status CreateListTail(LinkList* L , int n);
/**若线性表为空,返回true,否则返回false*/
bool ListEmpty(LinkList L);
/**将线性表清空*/
Status ClearList(LinkList* L);
/**将线性表中第i个位置元素值返回给e*/
Status GetElem(LinkList L,int i,ElemType* e);
/**在线性表中查找与给定值e相等的元素,如果查找成功,返回该元素在线性表中的序号表示成功;否则返回-1表示失败*/
int LocateElem(LinkList L ,ElemType e);
/**在线性表中的第i个位置插入元素e*/
Status ListInsert(LinkList* L,int i,ElemType e);
/**删除线性表中第i个位置的元素,并返回这个位置的元素值e*/
Status ListDelete(LinkList* L,int i,ElemType* e);
/**返回线性表L的元素个数*/
int ListLength(LinkList L);
/**遍历链表元素*/
Status TraverseList(LinkList L);
#endif //_LINK_LIST_H_
#include "stdafx.h"
#include "LinkList.h"
/**初始化操作,建立一个空的线性表L。*/
Status InitList(LinkList* L)
{
LinkList Head = (LinkList)malloc(sizeof(FLinkNode));
*L = Head;
return OK;
}
/**采用头插法初始化链表,建立一个包含n个元素的线性表L。*/
Status CreateListHead(LinkList* L , int n)
{
LinkList Head = (LinkList)malloc(sizeof(FLinkNode));
Head->Next = NULL;
*L = Head;
LinkList insertNode = NULL;
for (int i = 0 ; i < n ; i++)
{
insertNode = (LinkList)malloc(sizeof(FLinkNode));
insertNode->data = i;
insertNode->Next = Head->Next;
Head->Next = insertNode;
}
return OK;
}
/**采用尾插法初始化链表,建立一个包含n个元素的线性表L。*/
Status CreateListTail(LinkList* L , int n)
{
LinkList Tail = (LinkList)malloc(sizeof(FLinkNode));
Tail->Next = NULL;
*L = Tail;
for (int i = 0 ; i < n ; i++)
{
LinkList newNode = (LinkList)malloc(sizeof(FLinkNode));
newNode->data = i;
Tail->Next = newNode;
Tail = Tail->Next;
}
Tail->Next = NULL;
return OK;
}
/**若线性表为空,返回true,否则返回false*/
bool ListEmpty(LinkList L)
{
return L->Next == NULL;
}
/**将线性表清空*/
Status ClearList(LinkList* L)
{
LinkList p = (*L)->Next;
while(p)
{
LinkList q = p;
p = q->Next;
free(q);
}
(*L)->Next = NULL;
return OK;
}
/**将线性表中第i个位置元素值返回给e*/
Status GetElem(LinkList L,int i,ElemType* e)
{
int index = 0;
LinkList next = L->Next;
while(next && index != i)
{
next = next->Next;
index++;
}
if(index == i)
{
*e = next->data;
return OK;
}
return ERROR;
}
/**在线性表中查找与给定值e相等的元素,如果查找成功,返回该元素在线性表中的序号表示成功;否则返回-1表示失败*/
int LocateElem(LinkList L ,ElemType e)
{
int index = 0;
LinkList next = L->Next;
while(next && next->data != e)
{
index++;
next = next->Next;
}
return NULL == next ? -1 : index;
}
/**在线性表中的第i个位置插入元素e*/
Status ListInsert(LinkList* L,int i,ElemType e)
{
int index = 0 ;
LinkList next = (*L)->Next;
while(next)
{
if (i == 0 || index == i-1)
break;
next = next->Next;
index++;
}
if (index != i-1 && i!=0)
return ERROR;
LinkList newNode = (LinkList)malloc(sizeof(FLinkNode));
newNode->data = e;
newNode->Next = next->Next;
next->Next = newNode;
return OK;
}
/**删除线性表中第i个位置的元素,并返回这个位置的元素值e*/
Status ListDelete(LinkList* L,int i,ElemType* e)
{
int index = 0 ;
LinkList next = (*L)->Next;
while(next)
{
if (i == 0 || index == i-1)
break;
next = next->Next;
index++;
}
if (index != i-1 && i!=0)
return ERROR;
LinkList deleteNode = next->Next;
next->Next = deleteNode->Next;
*e = deleteNode->data;
free(deleteNode);
return OK;
}
/**返回线性表L的元素个数*/
int ListLength(LinkList L)
{
int count = 0;
LinkList next = L->Next;
while(next)
{
next = next->Next;
count++;
}
return count;
}
/**遍历链表元素*/
Status TraverseList(LinkList L)
{
if(ListEmpty(L))
return ERROR;
LinkList pNode = L->Next;
int i = 0 ;
while (pNode)
{
std::cout<<"第"<<i++<<"个元素为:"<<pNode->data<<std::endl;
pNode = pNode->Next;
}
return OK;
}