单链表的学习记录
一.链表的创建
利用尾插法创建链表,通过开辟新的空间赋值给newp,把p->next指向newp,再将newp赋给p,两个指针互相前进。
link *head,*p;int i,k;
head=(link *)malloc(sizeof(link));
head->next=NULL;
p=head;
scanf("%d",&k);
while(k>0)
{
link *newp;
newp=(link *)malloc(sizeof(link));
newp->shu=k;
p->next=newp;
p=newp;
p->next=NULL;
scanf("%d",&k);
}
return head;
二.链表的删除
通过历遍整个链表,对应每一个序号,输入序号,比对下一个数据是否为目标数据,若成功就把目标数据的上一个指针域指向目标数据的下一个数据。
link *p,*r;int a;
printf("请输入你要删除的数字:");
scanf("%d",&a);
p=head->next;
if(p->shu==a)
{
head->next=p->next;
}
else while(p)
{
r=p->next;
if(r->shu==a)
{
p->next=r->next;
break;
}
p=p->next;
}
三.链表的插入
还是通过序号来直接锁定到对应位置,创建结构体来录入插入数据,先将插入数据的指针指向插入位置的下一节点,再将插入位置的下一节点指向插入节点
int a,i=1;link *p,*pnew;
pnew=(link*)malloc(sizeof(link));
printf("请输入您要插入的序号:");
scanf("%d",&a);
p=head->next;
while(p)
{
if(i==a)
{
printf("请输入你插入的信息:");
scanf("%d",&pnew->shu);
pnew->next=p->next;
p->next=pnew;
break;
}
else
{
i++;
p=p->next;
}
}
return head;
四.链表的排序(冒泡)
通过两个指针,类比于普通冒泡排序即可
int a,i=1,j=1;link *p,*q;
p=head->next;
while(p)
{
q=p->next;
while(q)
{
if(q->shu>p->shu)
{
a=q->shu;
q->shu=p->shu;
p->shu=a;
}
q=q->next;
}
p=p->next;
}
return head;