一、单链表的结点插入
(1)插入的结点位于空链表
(2)插入的结点位于非空链表
- 插入的链表位于非空链表的头部
- 插入的链表为与非空链表的尾部
- 插入的链表位于非空链表的中间部分
创建一个单链表结点的插入函数,将输入的学生的序号作为排序,按照从小到大的学号顺序插入学生信息
sturct student *insert(struct student *head,struct student *new) /*定义插入节点函数 */
{
struct student *p1,*p2,*pnew;
p1 = p2 = head;
pnew = new;
if(head == NULL){
head = pnew ;
pnew->next = NULL;
}
else{
while((pnew->number > p1->number) && (p1->next !=NULL)){
p2 = p1; /* 不断移动指针 */
p1 = p1->next;
}
if(pnew->number <= p1->number){ /*按照从小到大的学号排序 */
if(p1 == head) /*判断插入位置是否是非空离链表的表头 */
{ pnew->next = p1; head = pnew; }
else /*插入位置位于链表中间*/
{p2->next = pnew; pnew->next = p1;}
}else{ /*插入位置位于链表的尾部 */
p1->next = pnew;
pnew = NULL ;
}
}
return (head);
}
二、单链表的结点删除
(1)判断要删除的链表是否为空链表
(2)判断要删除的结点是位于链表的表头、中间还是表尾。
创建一个函数用于删除学生的信息,判断学号位于链表中的哪个位置,然后进行删除
(struct student *)delete(struct student *head,int number) /* 删除链表结点的函数 */
{
struct student *p1,*p2;
p1 = p2 = head;
if(p1 == NULL){
printf("the list is empty\n"); /*输入的链表为空链表 */
}else
{
while((number != p1->number) && (p1->next != NULL)){
p2 = p1;
p1 = p1->next; /*不断移动指针,判断指向的结点是否为想要的结点 */
}
if((number == p1->number)) {
if(p1 == head ){
head = head->next; /* 要删除的结点位于表头 */
}else{
p2->next = p1->next; /* 要删除的结点位于中间或者表尾 */
}
}else{
printf("Don't have find the number\n"); /*没有找到要删除的结点 */
}
}
return (head);
}