无论是按序号删除节点还是按值查找删除节点,其本质都是一样的,用指针指向所要删除节点的前一个节点,使其绕过需要删除的节点,直接指向删除的节点所指向的节点(下下个节点)
#include<stdio.h>
#include<stdlib.h>
typedef struct student
{
int num;
struct student *next;
}Lstudent,*LPstudent;
void InitLink(LPstudent *phead)
{
Lstudent *ptr,*r;
*phead=NULL;
//-----------------------------------------------
ptr=malloc(sizeof(Lstudent));
*phead=ptr;
ptr->next=NULL;
//------------------------------------------------
int n;
printf("please input number of student:\n");
scanf("%d",&n);
while(n>0)
{
ptr=malloc(sizeof(Lstudent));
ptr->num=n;
ptr->next=NULL;
if((*phead)->next==NULL)///
(*phead)->next=ptr;//
else
r->next=ptr;
r=ptr;
printf("please input number of student:\n");
scanf("%d",&n);
}
}
void printf_link(Lstudent *ptri)
{
ptri=ptri->next;/
while(ptri!=NULL)
{
printf("%d ",ptri->num);
ptri=ptri->next;
}
}
/*----------------------------------------------------------------按序号查找并删除
LPstudent LocateElem(LPstudent ptr,int i)
{
int j=0;//有头节点,无头节点为1;
while(ptr->next!=NULL&&j<i)
{
ptr=ptr->next;
j++;
}
if(j==i)return ptr;
else return NULL;
}
void ListDelete(LPstudent ptr,int i)
{
LPstudent p1=LocateElem(ptr ,i);
LPstudent p2=ptr;
if(p1==NULL)printf("no this student\n");
else
{while(p2->next!=p1) //定位到i的前面一个节点
p2=p2->next;
p2->next=p1->next;
printf("--------after delete------------\n");
printf_link(ptr);
}
}
*/
//---------------------------------------------------------按值查找删除
LPstudent LocateElem(LPstudent ptr,int i)//查找函数
{
ptr=ptr->next;
if(ptr->num==i)return ptr;
else{
while(ptr->next!=NULL)
{
ptr=ptr->next;
if(ptr->num==i)return ptr;
}}
return NULL;
}
void ListDelete(LPstudent ptr,int i)//插入函数
{
LPstudent p1=LocateElem(ptr ,i);
LPstudent p2=ptr;
if(p1==NULL)printf("no %d student",i);
else
{while(p2->next!=p1) //定位到i的前面一个节点
p2=p2->next;
p2->next=p1->next;
printf("--------after delete------------\n");
printf_link(ptr);}
}
int main()
{
LPstudent head;
InitLink(&head);
printf_link(head);
ListDelete(head,3);}