数据结构什么最重要链表是基础,学会链

排版有些乱,请见谅!有问题可以直接在   ①.原链表为空:只需使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;}

赞赏

长按







































北京中科白癜风医院正规的吗
北京中科白癜风医院善行天下



转载请注明:http://www.92nongye.com/zyjs/zyjs/204621107.html