list.h 头文件

//本头文件采用中英文两种语言注释,意在大家都能看懂
//This head file consists of the two language of Chinese and English

/**********************************************************************
**
**--------------------------file infomation----------------------------
**file name:list.h
**
**last modified date:
**
**descriptioin:对于链表的各种操作------any operation of the list
**
**created by:Ethan Wei
***********************************************************************/

/**********************************************************************
头文件------head file
**********************************************************************/
#include <stdio.h>
#include <stdlib.h>
/**********************************************************************
宏定义------macro definition
**********************************************************************/
#define Type int     //链表元素类型
#define ROW 10      //打印链表是一行的个数

/*************************************************************************
结构体的定义-----------struct definition
*************************************************************************/


typedef struct list       //单链表数据结构------single list struct
{
Type data;        //链表中的数据
struct list *next;      //下一个指针
}_SList;


typedef struct ulist      //最后定义时的单链表数据结构
{
_SList *head;       //头节点
_SList *last;       //链表的尾指针
int   length;       //链表的长度
}SList;

/*************************************************************************
函数定义--------function definition
*************************************************************************/

/*************************************************************************
函数名称:InitList
函数表述: 对单链表进行初始化
输入值: SList *
返回值: 初始化成功返回0,否则退出
*************************************************************************/

int InitList(SList *list)
{
list->length = 0;         //初始化长度为0

list->head = (_SList *)malloc(sizeof(_SList));

if(list->head == NULL)
{
   fprintf(stderr,"内存不足,申请头结点空间失败");
   getchar();
   exit(1);
}
list->head->next = NULL;       //链表的尾指针置空
list->last = list->head;       //尾指针指向头指针
return 0;
}

/*************************************************************************
函数名称:create
函数表述: 申请一个动态的链表空间
输入值: 
返回值: 申请成功返回空间首地址,否则返回NULL
*************************************************************************/
_SList* create()
{
_SList *newList;

newList = (_SList*)malloc(sizeof(_SList));

if(newList == NULL)
{
   fprintf(stderr,"申请新空间失败------addtoHead");
   return NULL;
}

return newList;
}
/*************************************************************************
函数名称:findtoPosition
函数表述: 根据位置找到链表的元素
输入值: SList *,int position
返回值: 查找成功返回地址,否则返回NULL
*************************************************************************/
_SList *findtoPosition(SList* list,int position)
{
_SList *curList;
int i;

if(position <= 0 ||position >list->length)
{
   puts("查找位置不合法");
   return NULL;
}
curList = list->head->next;      //指向第一个元素

for(i = 1;i < position; i++)
{
   curList = curList->next;
}

return curList;
}
/*************************************************************************
函数名称:findtoData
函数表述: 根据元素找到位置
输入值: SList *,Type data
返回值: 查找成功打印信息,返回0
*************************************************************************/
int findtoData(SList* list,Type data)
{
_SList *curList;
int i;

curList = list->head->next;      //指向第一个元素
if(curList == NULL)
{
   puts("链表为空");
   return 1;
}
for(i = 1;i <= list->length;i ++)
{
   if(curList->data == data)
   {
    printf("位置:%d       查找元素:%d\n",i,data);
   }
   curList = curList->next;
}

return 0;
}
/*************************************************************************
函数名称:InsertList
函数表述: 插入链表
输入值: SList *,int position,Type data
返回值: 插入成功返回0,否则返回1
*************************************************************************/
int InsertList(SList *list,int position,Type data)
{
int i ;
_SList *curNode;
_SList *newNode;

curNode = list->head;    //设置当前节点为头节点,往后遍历

if(position > list->length+1 || position <= 0)
{
   printf("插入位置不合法");
   return 1;
}

for(i = 1; i < position; i++)
{
   curNode = curNode->next;
}
//循环结束,得到要插入的位置前一个节点

newNode = create();

newNode->data = data;

if(curNode->next != NULL)
{
   newNode->next = curNode->next;
   curNode->next = newNode;      //将节点链接上
}
else if(curNode->next == NULL)
{
   curNode->next = newNode;
   newNode->next = NULL;
   list->last    = newNode;      //更新尾部节点
}

list->length +=      1;      //更新链表长度
return 0; 
}
/*************************************************************************
函数名称:deltoPosition
函数表述: 删除链表,根据位置
输入值: SList *,int position
返回值: 删除成功返回0,否则返回1
*************************************************************************/
int deltoPosition(SList *list,int position)
{
_SList *curNode;     //当前节点指针
_SList *delNode;     //要删除的节点指针
int i;

if(position > list->length || position <= 0)         //第一次修改list->length 不能是list->length+1
{
   printf("删除位置不合法\n");
   return 1;
}

curNode = list->head;

for(i = 1;i < position;i ++)
{
   curNode = curNode->next;
}
//此时得到的节点是要删除节点的前面一个节点
delNode = curNode->next;   //此时delNode 就是要删除的节点

if(delNode->next == NULL)   //即删除最后一个节点
{
   curNode->next = NULL;
   free(delNode);
   list->last    = curNode; //更新最后一个节点
   list->length -= 1;    //更新链表长度
}
else
{
   curNode->next = delNode->next;
   free(delNode);
   list->length -= 1;    //更新链表长度
}

return 0;
}
/*************************************************************************
函数名称:deltoData
函数表述: 删除链表,根据元素
输入值: SList *,Type data
返回值: 删除成功返回0,否则返回1
*************************************************************************/
int deltoData(SList *list,Type data)
{
_SList *curList;
_SList *delList;

int delFlag = 0;        //是否删除成功

curList = list->head;       //指向第一个元素
if(curList->next == NULL)
{
   puts("链表为空");
   return 1;
}
while(curList->next != NULL)
{
   if(curList->next->data == data)
   {
    delList       = curList->next;
    if(delList->next == NULL)     //如果删除的节点为最后一个节点
    {
     free(delList);
     curList->next = NULL;
     list->length -= 1;      //更新链表长度
     list->last   = curList;     //更新尾部节点
     delFlag      += 1;
     break;
    }
    else
    {
     curList->next = delList->next;

     free(delList);
     list->length -= 1;      //更新链表长度

     delFlag += 1;       //记录删除次数
    }
   }
   curList       = curList->next;
}

if(delFlag != 0)
{
   printf("删除成功,共删除%d个元素,删除元素为%d\n",delFlag,data);
}
return 0;
}
/*************************************************************************
函数名称:addtoHead
函数表述: 头插入节点
输入值: SList *list,Type data
返回值: 插入成功返回0,否则返回1
*************************************************************************/
int addtoHead(SList *list,Type data)
{
static char lastFlag = 0;       //是否更新尾部节点的标记
_SList *newList;

newList = create();

newList->data       = data;

newList->next       = list->head->next;
list->head->next    = newList;

list->length   += 1;       //更新长度

if(list->head->next != NULL)
{
   lastFlag = 1;         //第一次插入不是头插法
}

if(lastFlag == 0)
{
   list->last          = newList;     //更新末尾节点
   lastFlag            = 1;
}
return 0;
}

/*************************************************************************
函数名称:addtoTail
函数表述: 尾插入节点
输入值: SList *list,Type data
返回值: 插入成功返回0,否则返回1
*************************************************************************/
int addtoTail(SList *list,Type data)
{
_SList *newList;

newList = create();

newList->data = data;

list->last->next    = newList;
newList->next       = NULL;

list->length        += 1;        //更新长度

list->last          = newList;       //更新末尾节点

return 0;
}
/*************************************************************************
函数名称:Traversal
函数表述: 遍历链表
输入值: SList *list
返回值:
*************************************************************************/
void Traversal(SList *list)
{
_SList *curList;
int i = 0;

curList = list->head;

printf("链表长度:%d\n",list->length);
printf("链表内容如下:");

for(i = 0;i < list->length;i++)
{
   if(i % ROW == 0)
   {
    puts("");
   }
   printf("%d ",curList->next->data);

   curList = curList->next;
}
puts("");
}
/*************************************************************************
函数名称:destroyList
函数表述: 销毁链表
输入值: SList *
返回值: 删除成功返回0,否则返回1
*************************************************************************/
int destroyList(SList *list)
{
int nResult;

while(list->head->next != NULL)
{
   nResult = deltoPosition(list,1);
}

return nResult;
}

//经过测试没什么bug如果还有,欢迎大家提出和修改


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值