作业Day5:
1】思维导图
基于Day4链表的扩展
2】完成单向循环链表的所有操作 【创建、判空、尾插、遍历、尾删、销毁】
looplinkList.c文件
#include "looplinkList.h"
//创建循环链表
looplinkListPtr creatloopList()
{//申请地址looplinkListPtr H=(looplinkListPtr)malloc(sizeof(looplinkList));//判断是否合法if(NULL==H){printf("申请失败!\n");return NULL;}printf("申请成功!\n");//初始化H->len=0;H->next=H;return H;
}//判空
int ifEmpty(looplinkListPtr H)
{//判断地址是否合法if(NULL==H){printf("地址不合法!\n");return -1;}//判断链表是否为空:长度是否为0 或者 是否指向自己return H->len==0;
}looplinkListPtr creatNode(DataType e)
{//申请空间looplinkListPtr p=(looplinkListPtr)malloc(sizeof(looplinkList));//放入数据p->data=e;p->next=NULL;return p;
}//尾插
void enddAdd(looplinkListPtr H,DataType e)
{//判断地址是否合法if(NULL==H){printf("地址不合法!\n");return;}looplinkListPtr temp=H;//遍历得到最后一个节点while(temp->next!=H){temp=temp->next;}//申请新的节点looplinkListPtr newnode=creatNode(e);//使原最后一个节点,指向本节点temp->next=newnode;//使本节点指向头节点newnode->next=H;//尾插,链表长度+1H->len++;
}
//尾删数据
void enddelData(looplinkListPtr H)
{//判断地址是否合法if(NULL==H||ifEmpty(H)){printf("尾删失败!\n");return;}looplinkListPtr temp=H;//遍历得到最后一个节点的前一个节点while(temp->next->next!=H){temp=temp->next;}//释放所指向的空间free(temp->next);//将本空降指向头节点temp->next=H;//尾删,链表长度-1H->len--;
}//遍历:数据显示
void showData(looplinkListPtr H)
{//检查传入地址是否合法//检查链表是否非空if(NULL==H||ifEmpty(H)){printf("链表地址不合法或者链表数据为空!\n");}looplinkListPtr temp=H;while(temp->next!=H){temp=temp->next;printf("%d ",temp->data);}printf("\n");
}//销毁链表
void freeList(looplinkListPtr *HH)
{//判断地址是否合法if(NULL==*HH){printf("地址不合法!\n");return;}while((*HH)->len)//循环条件:本节点不是头节点{enddelData(*HH);}//释放头节点所在空间free(*HH);//将指向头节点的指针置NULL*HH=NULL;//本指针也置NULLHH=NULL;printf("链表已销毁!\n");
}
运行效果
3】完成双向循环链表的所有操作 【创建、判空、尾插、遍历、尾删、销毁】
loopDoubleList.c文件
#include "loopDoubleList.h"//创建循环双向链表
loopDoubleListPtr listMalloc()
{//申请节点loopDoubleListPtr H=(loopDoubleListPtr)malloc(sizeof(loopDoubleList));if(NULL==H){printf("申请失败!\n");return NULL;}printf("申请成功!\n");//数据初始化H->len=0;H->prior=H;H->next=H;return H;
}//判空
int ifEmpty(loopDoubleListPtr H)
{if(NULL==H){printf("链表地址不合法!\n");}return H->next==H;
}
//申请节点 放入数据
loopDoubleListPtr creatNode(DataType e)
{//申请空间loopDoubleListPtr p=(loopDoubleListPtr)malloc(sizeof(loopDoubleList));//放入数据p->data=e;p->prior=NULL;p->next=NULL;return p;
}//尾插
void enddAdd(loopDoubleListPtr H,DataType e)
{//判断地址是否合法if(NULL==H){printf("地址不合法!\n");return;}loopDoubleListPtr temp=H;//遍历得到最后一个节点while(temp->next!=H){temp=temp->next;}//申请新的节点loopDoubleListPtr newnode=creatNode(e);//处理本节点指向newnode->next=H;//本节点也指向Hnewnode->prior=temp;//本节点指向原最后一个节点//处理原最后一个节点指向:temp->next=newnode;//原最后一个节点指向本空间//处理头节点指向H->prior=newnode;//尾插,链表长度+1H->len++;
}//数据显示
void showData(loopDoubleListPtr H)
{//检查传入地址是否合法//检查链表是否非空if(NULL==H||ifEmpty(H)){printf("链表地址不合法!\n");}loopDoubleListPtr temp=H;while(temp->next!=H){temp=temp->next;printf("%d ",temp->data);}printf("\n");
}//尾删数据
void enddelData(loopDoubleListPtr H)
{//判断地址是否合法if(NULL==H||ifEmpty(H)){printf("尾删失败!\n");return;}loopDoubleListPtr temp=H;//遍历得到最后一个节点while(temp->next!=H){temp=temp->next;}//处理上一个空间的指向temp->prior->next=temp->next;//上一个空间指向下一个空间//处理下个空间的指向temp->next->prior=temp->prior;//下一个空间指向上一个空间//释放向本空间free(temp);//将本空间置NULLtemp=NULL;//尾删,链表长度-1H->len--;
}//销毁链表
void freeList(loopDoubleListPtr *HH)
{//判断地址是否合法if(NULL==*HH){printf("地址不合法!\n");return;}while((*HH)->len)//循环条件:本节点不是头节点{enddelData(*HH);}//释放头节点所在空间free(*HH);//将指向头节点的指针置NULL*HH=NULL;//本指针也置NULLHH=NULL;printf("链表已销毁!\n");
}
运行效果