// 指的是顺序表中的元素的数据类型,用户可以根据需要进行修改
typedef int DataType_t;
// 构造链表SeqList—_t的结点,结点中包含数据域和指针域,并且所有结点中的数据应该相同
typedef struct SeqList
{
DataType_t Data;
struct SeqList *next;
} LinkList_t;
//创建一个空链表,空链表中有一个头结点,并对链表初始化
LinkList_t *LLIst_Create(void)
{
//创建一个头结点并为头结点申请内存
LinkList_t *Head=(SeqList_t *)calloc(1,sizeof(LinkLIst_t));
if(NULL==Head){
perror("Calloc memeroy for Head is Failed");
exit(-1);
}
//对头结点进行初始化,头结点不存储有效数据
Head->next=NULL;
}
//设计一个算法删除单链表L(有头结点)中的一个最小值结点
bool LinkList_DelMin (SeqList_Del *L)
{
//判断链表是否为空
if(NULL==Head->next){
perror("LinkList is void");
return false;
}
//遍历链表元素,并记录最小的数据项及其地址
DataType_t *temp=Head; //定义变量遍历所有节点
DataType_t min=*(Head->next->Data); //定义变量并初始化为首结点数据项,遍历后记录最小的数据
DataType_t *p=Head->next; //定义变量并初始化为首结点的地址后记录最小结点的地址
DataType_t *q=Head->next;//定义变量并初始化为头结点的地址后记录最小节点直接前驱的地址
//判断当前节点的直接后继结点是否为尾结点
while(temp->next){
//判断当前节点直接后继中的数据项与最小结点的数据项大小
if(min<temp->next->Data){
min=temp->next->Data;//如果符合,记录最小数据项
p=temp->next;//记录最小数据项所在结点
q=temp;//记录最小数据项直接前驱结点
}
temp=temp->next;//遍历后续结点
}
//删除最小数据项所在的结点
//当首结点为最小项时
if(p=Head->next){
Head->next=p->next; //头结点的指针域指向首元素的下一结点的地址
p->next=NULL; //释放原首结点的指针域和数据域
p->Data=0; //清除原首结点中数据项的数据
p=NULL; //清除自定义变量p和temp的数据
temp=NULL; //清除遍历链表的指针
return true;
}
//尾结点为最小项时
if(p->next==NULL){
p->Data=0; //清除原尾结点数据项中的数据
p==NULL; //清除指向最小结点的指针中的数据
q->next=NULL; //将最小结点直接前驱作为尾指针
temp=NULL; //清除遍历链表的指针
return ture;
}
//中间结点为最小项时
else{
q->next=p->next; //最小结点直接前驱的指针域指向最小结点的直接后继
p->next=NULL; //将最小结点的指针域指向NULL
p->Data=0; //将原最小结点的值清零
p=NULL; //清除指向原最小结点的指针;
return ture;
}
}
总结:
删除链表中结点前,应当判断链表是否为空
删除链表中结点时,应当注意“先连接,后断开”的规则
删除链表中结点时,应当先判断需要删除的结点位于链表的什么位置,位置不同,连接和断开的位置也是不同的