#include <stdio.h>
#include <stdlib.h>
//定义函数结果状态码
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
//定义数据类型
typedef int ElemType ;
//定义程序返回状态类型
typedef int State;
//线性表的单链表存储结构
struct Node
{
ElemType data;
struct Node *next;
};
typedef struct Node *LinkList;
//单链表的数据操作
/*************************************************
Function: CreateList
Description: 创建一个带头结点的空链表
Input:
Output:
Return: 成功返回头指针,失败
Others:
*************************************************/
LinkList CreateList()
{
LinkList head;
head = malloc(sizeof(struct Node));
if(head == NULL)
{
printf("Apply HeadNode Failed");
return NULL;
}
//指针域为空
head->next = NULL;
return head;
}
/*************************************************
Function: EmptyList
Description: 判断单链表是否为空
Input: 必须存在的头指针 head
Output:
Return: 空返回TRUE,否则返回FALSE
Others:
*************************************************/
State EmptyList(LinkList head)
{
if(head->next == NULL)
return TRUE;
else
return FALSE;
}
/*************************************************
Function: ClearList
Description: 将单链表置为空表
Input: 必须存在的头指针 head
Output:
Return: 成功返回OK
Others:
*************************************************/
State ClearList(LinkList head)
{
LinkList p,q;
//p指向第1个数据节点
p = head->next;
//第n轮循环先验证第n个结点存在,进入循环后,q保存第n+1个结点,释放第n个结点
//p最终指向第n+1个数据节点
while(p != NULL)
{
q = p->next;
free(p);
p = q;
}
head->next = NULL;
return OK;
}
/*************************************************
Function: GetLength
Description: 计算单链表数据元素,不包括头结点
Input: 必须存在的头指针 head
Output:
Return: 数据元素个数 num 大于等于0
Others:
*************************************************/
int GetLength(LinkList head)
{
int num = 0;
//指向第1个数据结点
LinkList p = head->next;
//第n轮循环先验证第n个结点是否存在,进入循环中,num++后为n,p指向第n+1个数据节点
while(p != NULL)
{
num++;
p = p->next;
}
return num;
}
/*************************************************
Function: GetNode
Description: 查找第index个(不算头结点)结点的指针
Input: 必须存在的头指针 head
位序 index 有效范围 1~length
Output:
Return: 成功返回结点指针,失败返回NULL
Others:
*************************************************/
LinkList GetNode(LinkList head, int index)
{
//判断是不是空链表
if(head->next == NULL)
{
printf("The linklist is empty");
return NULL;
}
//index < 1
if(index < 1)
{
printf("Index Out of Bounds");
return NULL;
}
//指向第1个结点
LinkList p = head->next;
//结点计数器
int i = 1;
//第n轮循环首先验证n<index,第index结点是否为空,进入循环后,i++后会为n+1,p会指向第n+1个数据结点,
//i=index退出,p指向第index个结点
//p=NULL退出,越界
while((i < index) && (p != NULL))
{
i++;
p = p->next;
}
//验证是否越界
//若i=index退出,不知第index结点是否存在
//若p=NULL退出,必越界
if(p == NULL)
{
printf("Index Out of Bounds");
return NULL;
}
return p;
}
/*************************************************
Function: LocateNode
Description: 查找单链表第一个为值e的数据结点位序(不算头结点)
Input: 必须存在的头指针 head
数据元素值 e
Output:
Return: 成功返回位序(1 ~ length),未找到返回-1
Others:
*************************************************/
int LocateNode(LinkList head, ElemType e)
{
//判断是不是空链表
if(head->next == NULL)
{
printf("The linklist is empty");
return -1;
}
//指向第1个数据结点
LinkList p = head->next;
//结点计数器
int i = 1;
//第n轮循环首先验证第n数据结点存在,存在进入循环中,
//匹配返回n,否则i++后会为n+1,p会指向第n+1数据结点,
while(p != NULL)
{
if(p->data == e)
return i;
p = p->next;
i++;
}
//不存在数据为e的结点
return -1;
}
/*************************************************
Function: InsertNode
Description: 在单链表的index位置处(不算头结点)处插入元素值为e的结点,即插入后e元素结点处在第index的位置
Input: 必须存在的头指针 head
插入元素位置 index 有效范围 0~length+1
Output:
Return: 成功返回OK,失败返回ERROR
Others:
*************************************************/
State InsertNode(LinkList head, int index, ElemType e)
{
//插入位置
if(index < 1)
{
printf("Index Out of Bounds");
return ERROR;
}
//单链表位置计数器
int i = 1;
LinkList p, s;
//p指向头结点
p = head;
//第n轮循环开始先验证第n个结点是否 < index,第n-1个结点是否为空,进入循环中,i++后会为n+1,p会指向第n数据结点
//i=index退出时,p保存第index-1个结点
//p=NULL退出时,必定越界
while((i < index) && (p != NULL))
{
p = p->next;
i++;
}
//判断是否越界
//i=index退出,不确定第index-1及index结点是否为空
//p = NULL必定越界
if((p == NULL) || (p->next == NULL))
{
printf("Index Out of Bounds");
return ERROR;
}
s = malloc(sizeof(struct Node));
//申请结点失败
if(s == NULL)
{
printf("Apply Node Failed");
return ERROR;
}
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
/*************************************************
Function: DeleteNode
Description: 删除单链表的index位置处(不算头结点)结点
Input: 必须存在的头指针 head
删除结点位置 index 有效范围 1~length
Output:
Return: 成功返回OK,失败返回ERROR
Others:
*************************************************/
State DeleteNode(LinkList head,int index)
{
//判断是不是空链表
if(head->next == NULL)
{
printf("The linklist is empty");
return ERROR;
}
if(index < 1)
{
printf("Index Out of Bounds");
return ERROR;
}
//p指向头结点
LinkList p = head,s;
//结点计数器,提前指向第一个结点
int i = 1;
//第n轮循环开始先验证第n个结点是否 < index,第n-1个结点是否为空,进入循环中,i++后会为n+1,p会指向第n数据结点
//i=index退出时,p保存第index-1个结点
//p=NULL退出时,必定越界
while((i < index) && (p != NULL))
{
p = p->next;
i++;
}
//判断是否越界
//i=index退出,不确定第index-1及index结点是否为空
//p = NULL必定越界
if((p == NULL) || (p->next == NULL))
{
printf("Index Out of Bounds");
return ERROR;
}
s = p->next;
p->next = s->next;
free(s);
return OK;
}
/*************************************************
Function: InsertNodeHead
Description: 采用头插法插入1元素
Input: 必须存在的头指针 head
数据元素 e
Output:
Return: 成功返回OK,失败返回ERROR
Others:
*************************************************/
State InsertNodeHead(LinkList head, ElemType e)
{
//申请结点
LinkList s = malloc(sizeof(struct Node));
if(s == NULL)
{
printf("Apply Node Failed");
return ERROR;
}
s->data = e;
//头插
s->next = head->next;
head->next = s;
return OK;
}
/*************************************************
Function: InsertNodeTail
Description: 采用尾插法插入1元素
Input: 必须存在的头指针 head
数据元素 e
Output:
Return: 成功返回OK,失败返回ERROR
Others:
*************************************************/
State InsertNodeTail(LinkList head, ElemType e)
{
LinkList s,p;
//申请结点
s = malloc(sizeof(struct Node));
if(s == NULL)
{
printf("Apply Node Failed");
return ERROR;
}
s->data = e;
//p指向头结点
p = head;
//第n轮循环首先验证din个结点是否存在,存在进入循环,p指向dinge结点
//循环退出p保存尾结点
while(p->next != NULL)
{
p = p->next;
}
//尾插
s->next = NULL;
p->next = s;
return OK;
}
数据结构C语言实现之单链表
最新推荐文章于 2023-12-28 19:38:27 发布