算法思路
定义四个指针:
p用于遍历链表,pre用于保存p的前驱防止断链。
minp用于标记当前链表最小值,minpre用于保存minp的前驱防止断链,方便删除。
算法设计
1)设计链表结点结构体
typedef struct LNode
{
int data;//数据域
struct LNode* next;//指向后继的指针
}LNode,*LinkList;//给struct LNode起别名:LNode,给LNode* 起别名LinkList
2)Del_min() 设计
void Del_Listmin(LinkList L)
{
LNode* pre=L;
LNode* p=pre->next;
LNode* minpre=L;
LNode* minp=minpre->next;
while(p)
{
if(p->data<minp->data)
{
minp=p;
minpre=pre;
pre=p;
p=p->next;
}
else
{
pre=p;
p=p->next;
}
}
minpre->next=minp->next;
free(minp);
}
为了方便查看链表信息,设计一个查看链表元素的函数
ShowList(LinkList L)
//查看传入链表的结点值情况
void ShowList(LinkList L)
{
LNode* p=L->next;
while(p)
{
if(p->next)
{
printf("%d->",p->data);
}
else
{
printf("%d",p->data);
}
p=p->next;
}
printf("\n");
}
尾插法创建链表算法
//尾插法创建链表
LinkList Creat_LinkList()
{
LNode* s=NULL;//s用于标记插入结点
int input=0;
LinkList L=(LNode*)malloc(sizeof(LNode));
LNode* rear=L;//建立尾指针指向链表最后一个元素
printf("请输入整型数据,回车确认,输入-1完成链表创建:\n");
scanf("%d",&input);
while(input!=-1)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=input;
rear->next=s;
rear=s;
scanf("%d",&input);
}
rear->next=NULL;
printf("链表建立成功!\n");
return L;
}
main.c中执行代码如下:
int main()
{
LinkList L=Creat_LinkList();
ShowList(L);
Del_Listmin(L);
ShowList(L);
return 0;
}
结果如图所示:
1表示链表结束
链表中有些常用过的方法可以自己整理成文件 LinkList.h