LinList.h
//单链表的操作实现
#include "stdio.h"
#include "math.h"
//定义一个结构体
typedef struct Node
{
//定义值
DataType data;
//定义节点
struct Node *next;
}SLNode;
//初始化 (结构体指针来保存头节点)
void ListInitiate(SLNode **head)
{
//malloc()用于向系统动态申请size个字节的内存空间,函数返回值为所申请内存空间的首地址
//申请头节点,由head指示其地址
*head = (SLNode *)malloc(sizeof(SLNode));
//置结束为NULL
(*head)->next = NULL;
}
//求当前元素的个数 (结构体指针来保存头节点)
int ListLength(SLNode *head)
{
//p指向头节点
SLNode *p = head;
//size初始值为0
int size = 0;
//向后计数(让指针p每次直接指向后续的节点,当后续的节点为空时,结束该循环,并返回统计的元素的个数)
while(p->next !=NULL)
{
p = p->next;
size++;
}
return size;
}
//插入元素(头节点,插入的位置i,插入的数x)
int ListInsert(SLNode *head,int i,DataType x)
{
SLNode *p,*q;
int j;
//p指向头节点
p = head;
//j为单链表的初始位置
j = -1;
//当后续节点为空,且已经到插入元素所指的位置,则此循环结束!
while(p->next !=NULL&&j<i-1)
{
//指针p每次直接指向后续的节点
p=p->next;
//每往后走一步就加一,最后为要插入元素的位置
j++;
}
//判断元素插入的位置是否正确
if(j!=i-1)
{
printf("插入元素位置参数错误!");
return 0;
}
//生成一个新的节点,为新节点的数据域赋值为x
q=(SLNode *)malloc(sizeof(SLNode));
q->data=x;
//两者的顺序不能改变
//将新节点的指针域指向后一个节点
q->next=p->next;
//插入元素位置的前一个的指针域指向该新的节点
p->next=q;
return 1;
}
//删除元素(节点,删除的位置,储存要删除的元素)
int ListDelete(SLNode *head,int i,DataType *x)
{
SLNode *p,*s;
int j;
//p指向头节点
p=head;
//j为单链表的初始位置
j=-1;
//当后续节点为空,且已经到删除元素所指的位置,则此循环结束!
while(p->next!=NULL&&p->next->next!=NULL&&j<i-1)
{
//指针p每次直接指向后续的节点
p=p->next;
//每往后走一步就加一,最后为要插入元素的位置
j++;
}
//判断所要删除元素的位置是否出现了错误
if(j!=i-1)
{
printf("删除元素位置参数错!");
return 0;
}
//指针s指向删除元素的节点
s=p->next;
//将删除元素的数据域的值赋值给指针变量x
*x=s->data;
//将删除元素的节点指向其后面一个节点
p->next=p->next->next;
//释放s所指向的内存空间
free(s);
return 1;
}
//取出元素(头节点,取出元素的位置,所要取出的值
int ListGet(SLNode *head,int i,DataType *x)
{
SLNode *p;
int j;
//p指向头节点
p= head;
//j为单链表的初始位置
j= -1;
//当后续节点为空,且已经到删除元素所指的位置,则此循环结束!
while(p->next != NULL && j < i)
{
//指针p每次直接指向后续的节点
p=p->next;
//每往后走一步就加一,最后为要取出的元素的位置
j++;
}
//判断所要删除元素的位置是否出现了错误
if(j != i)
{
printf("删除元素位置参数错!");
return 0;
}
//变量指针x指向数据域
*x=p->data;
return 1;
}
//撤销单链表(因在申请链表时是申请的动态链表,而系统只负责自动收回程序中的静态分配的内存空间)
void Destroy(SLNode **head)
{
SLNode *p,*p1;
p=*head;
while(p!=NULL)
{
p1=p;
p=p->next;
free(p1);
}
*head=NULL;
}