排版有些乱,请见谅!有问题可以直接在 ①.原链表为空:只需使head指向被插节点即可。 ②.在第一个节点之前插入:使head指向被插节点,被插节点的next指向原来的第一节点。
STU*link_insert_head(STU*head,STU*p_new)//在表头插入{if(head==NULL)//链表为空{head=p_new;p_new-next=NULL;}else{p_new-next=head;//新来的节点作为头节点head=p_new;}returnhead;
③.在中间位置插入:使插入位置的前一节点的next指向被插节点,被插节点的next指向插入位置的后一节点。
STU*link_insert_order(STU*head,STU*p_new)//按顺序插入{STU*pf=head,*pb=head;if(head==NULL)//链表为空链表{head=p_new;p_new-next=NULL;}while((pb-nump_new-num)(pb-next!=NULL))//循环找{pf=pb;pb=pb-next;}if(pb-num=p_new-num)//找到一个节点的num比新来的节点num大,插在pb的前面{if(pb==head)//找到的节点是头节点,插在最前面{p_new-next=head;head=p_new;}else{pf-next=p_new;p_new-next=pb;}}else//没有找到pb的num比p_new-num大的节点,插在最后{pb-next=p_new;p_new-next=NULL;}returnhead;}
④.在表末尾插入:是链表尾节点next指向被插节点,被插节点next指向NULL。
STU*link_insert_end(STU*head,STU*p_new)//在尾部插入{STU*p_mov=head;if(head==NULL)//没有节点{head=p_new;p_new-next=NULL;}else{while(p_mov-next!=NULL)//找到链表最后一个节点{p_mov=p_mov-next;}p_mov-next=p_new; //最后一个节点指向新插入的节点p_new-next=NULL;}returnhead;}
6.链表的删除:删除是将某一节点从链中摘除,并释放相应的空间。
?删除的第一步是找到要删除的节点,同查找算法,若找不到或链表为空,提示未找到
?找到后根据情况删除此节点
①.被删节点是第一个节点:只需使head指向第二个节点即可。
②.被删节点不是第一个节点:使被删节点的前一节点指向被删节点的后一节点即可。
STU*delete_link_num(STU*head,intnum)//按学号删除{STU*pf=head,*pb=head;if(pb==NULL)//链表为空,不用删{printf("链表为空,没有您要找的结点\n");return;}while((pb-num!=num)(pb-next!=NULL))//循环找,要删除的节点{pf=pb;pb=pb-next;}if(pb-num==num)//找到了一个节点的num和num相同{if(pb==head)//要删除的节点是头节点{head=pb-next;}else{pf-next=pb-next;}free(pb);}else//没有找到{printf("没有您要找的结点\n");}returnhead;}
STU*delete_link_name(STU*head,char*name)//按姓名删除{STU*pb=head,*pf=head;if(pb==NULL)//链表为空,不用删{printf("链表为空,没有您要找的结点\n");return;}while((strcmp(pb-name,name)!=0)(pb-next!=NULL))//循环找,要删除的节点{pf=pb;pb=pb-next;}if(strcmp(pb-name,name)==0)//找到了一个节点的name和name相同{if(pb==head)//要删除的节点是头节点{head=pb-next;}else{pf-next=pb-next;}free(pb);}else//没有找到{printf("没有您要找的结点\n");}returnhead;}
7.链表的释放
?同遍历链表类似,区别在于p_mov每指向某个节点后都将该节点释放
?释放前要先保存下一个节点,释放后备份恢复给p_mov,否则释放了当前节点,下一个节点的地址就将丢失
?依次将所有节点释放后,最后返回NULL(标示释放完毕)
STU*free_link(STU*head){STU*pb=head;while(head!=NULL){pb=head;head=head-next;free(pb);}returnNULL;}
8.链表排序:当链表本身是无序的时候,我们需要对链表的所有数据进行排序,算法同冒泡法、选择法。
STU*link_order(STU*head)//排序{STU*pf=head,*pb,temp;if(head==NULL){printf("链表为空\n");return;}if(head-next==NULL){printf("只有一个结点,不用排序\n");return;}while(pf-next!=NULL)//以pf指向的节点为基准节点,{pb=pf-next;//pb从基准元素的下个元素开始while(pb!=NULL){if(pf-numpb-num){temp=*pf;*pf=*pb;*pb=temp;temp.next=pf-next;pf-next=pb-next;pb-next=temp.next;}pb=pb-next;}pf=pf-next;}returnhead;}
赞赏