typedef char DataType;
typedef struct node
{
DataType data;
struct node *next;
}NODE;
NODE* CreateSinglyLinkedList();
int Insert(NODE *head, DataType data, int index);
int Delete(NODE *head, DataType data);
int Delete(NODE *head, int index);
int ClearList(NODE *head);
int GetLength(NODE *head);
BOOL IsEmpty(NODE *head);
DataType GetAt(NODE *head, int index);
NODE* FindAddr(NODE *head, DataType data);
int FindIndex(NODE *head, DataType data);
int SetAt(NODE *head, int index, DataType data);
/************************************************************************
函数名: CreateSinglyLinkedList
作 者: 谭友亮(Charles Tan)
日 期: 2013-4-17
作 用: 创建循环单链表
形参数:
返回值:
************************************************************************/
NODE* CreateSinglyLinkedList()
{
NODE *head = (NODE*)malloc(sizeof(NODE));
head->next = head;
return head;
}
/************************************************************************
函数名: Insert
作 者: 谭友亮(Charles Tan)
日 期: 2013-4-17
作 用: 往循环单链表中插入数据元素
形参数:
返回值:
************************************************************************/
int Insert(NODE *head, DataType data, int index)
{
NODE *curNode = (NODE*)malloc(sizeof(NODE));
curNode->data = data;
if (head == NULL)
{
return -1;
}
if (index < 0 || index > GetLength(head))
{
return -2;
}
NODE *p = head;
for(int i = 0; i < index; i++)
{
p = p->next;
}
curNode->next = p->next;
p->next = curNode;
return 0;
}
/************************************************************************
函数名: GetLength
作 者: 谭友亮(Charles Tan)
日 期: 2013-4-17
作 用: 获得循环单链表的长度
形参数:
返回值:
************************************************************************/
int GetLength(NODE *head)
{
int len = 0;
NODE *p = head;
if (head == NULL)
{
return -1;
}
while(p->next != head)
{
len++;
p = p->next;
}
return len;
}
/************************************************************************
函数名: Delete
作 者: 谭友亮(Charles Tan)
日 期: 2013-4-17
作 用: 删除循环单链表中指定位置的元素
形参数:
返回值:
************************************************************************/
int Delete(NODE *head, int index)
{
NODE *pre = head;
NODE *p;
if (head == NULL)
{
return -1;
}
if (index < 0 || index >= GetLength(head))
{
return -2;
}
for(int i = 0; i < index; i++)
{
pre = pre->next;
}
p = pre->next;
pre->next = pre->next->next;
free(p);
return 0;
}
/************************************************************************
函数名: Delete
作 者: 谭友亮(Charles Tan)
日 期: 2013-4-17
作 用: 删除循环单链表第一个与指定元素相等的元素
形参数:
返回值:
************************************************************************/
int Delete(NODE *head, DataType data)
{
NODE *pre = head;
NODE *p;
if (head == NULL)
{
return -1;
}
while(pre->next != NULL && pre->next->data != data)
{
pre = pre->next;
}
if (pre->next == NULL)
{
return -3;
}
p = pre->next;
pre->next = pre->next->next;
free(p);
return 0;
}
/************************************************************************
函数名: ClearList
作 者: 谭友亮(Charles Tan)
日 期: 2013-4-17
作 用: 清除循环单链表
形参数:
返回值:
************************************************************************/
int ClearList(NODE *head)
{
NODE *p = head->next;
NODE *q;
if (head == NULL)
{
return -1;
}
while(p != NULL)
{
q = p->next;
head->next = q;
free(p);
p = q;
}
return 0;
}
/************************************************************************
函数名: IsEmpty
作 者: 谭友亮(Charles Tan)
日 期: 2013-4-17
作 用: 判断循环单链表是否为空
形参数:
返回值:
************************************************************************/
BOOL IsEmpty(NODE *head)
{
if (head->next == NULL)
{
return true;
}
return false;
}
/************************************************************************
函数名: GetAt
作 者: 谭友亮(Charles Tan)
日 期: 2013-4-17
作 用: 获取循环单链表中指定位置的元素
形参数:
返回值:
************************************************************************/
DataType GetAt(NODE *head, int index)
{
NODE *p = head->next;
if (head == NULL)
{
return -1;
}
if (index < 0 || index >= GetLength(head))
{
return -2;
}
for(int i = 0; i < index; i++)
{
p = p->next;
}
return p->data;
}
/************************************************************************
函数名: FindAddr
作 者: 谭友亮(Charles Tan)
日 期: 2013-4-17
作 用: 获取循环单链表中指定元素的地址
形参数:
返回值:
************************************************************************/
NODE* FindAddr(NODE *head, DataType data)
{
NODE *p = head->next;
if (head == NULL)
{
return NULL;
}
while(p != NULL && p->data != data)
{
p = p->next;
}
if (p == NULL)
{
return NULL;
}
return p;
}
/************************************************************************
函数名: FindIndex
作 者: 谭友亮(Charles Tan)
日 期: 2013-4-17
作 用: 获取循环单链表中指定元素的索引
形参数:
返回值:
************************************************************************/
int FindIndex(NODE *head, DataType data)
{
int index = 0;
NODE *p = head->next;
if (head == NULL)
{
return -1;
}
while(p != NULL && p->data != data)
{
index++;
p = p->next;
}
if (p == NULL)
{
return -3;
}
return index;
}
/************************************************************************
函数名: SetAt
作 者: 谭友亮(Charles Tan)
日 期: 2013-4-17
作 用: 将指定位置的元素赋予指定值
形参数:
返回值:
************************************************************************/
int SetAt(NODE *head, int index, DataType data)
{
NODE *p = head->next;
if (head == NULL)
{
return -1;
}
if (index < 0 || index >= GetLength(head))
{
return -2;
}
for(int i = 0; i < index; i++)
{
p = p->next;
}
p->data = data;
return 0;
}
循环单链表相关操作
最新推荐文章于 2020-09-16 17:24:42 发布