3、刪除
假如我們已經(jīng)知道了要刪除的結(jié)點(diǎn)p的位置,那么要刪除p結(jié)點(diǎn)時只要令p結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)的鏈域由存儲p結(jié)點(diǎn)的地址該為存儲p的后繼結(jié)點(diǎn)的地址,并回收p結(jié)點(diǎn)即可。
以下便是應(yīng)用刪除算法的實例:
#include
#include
#include
#define N 10
typedef struct node
{
char name[20];
struct node *link;
}stud;
stud * creat(int n) /*建立新的鏈表的函數(shù)*/
{
stud *p,*h,*s;
int i;
if((h=(stud *)malloc(sizeof(stud)))==NULL)
{
printf("不能分配內(nèi)存空間!");
exit(0);
}
h->name[0]='\0';
h->link=NULL;
p=h;
for(i=0;i
if((s= (stud *) malloc(sizeof(stud)))==NULL)
{
printf("不能分配內(nèi)存空間!");
exit(0);
}
p->link=s;
printf("請輸入第%d個人的姓名",i+1);
scanf("%s",s->name);
s->link=NULL;
p=s;
}
return(h);
}
stud * search(stud *h,char *x) /*查找函數(shù)*/
{
stud *p;
char *y;
p=h->link;
while(p!=NULL)
{
y=p->name;
if(strcmp(y,x)==0)
return(p);
else p=p->link;
}
if(p==NULL)
printf("沒有查找到該數(shù)據(jù)!");
}
stud * search2(stud *h,char *x) /*另一個查找函數(shù),返回的是上一個查找函數(shù)的直接前驅(qū)結(jié)點(diǎn)的指針,*/
/*h為表頭指針,x為指向要查找的姓名的指針*/
/*其實此函數(shù)的算法與上面的查找算法是一樣的,只是多了一個指針s,并且s總是指向指針p所指向的結(jié)點(diǎn)的直接前驅(qū),*/
/*結(jié)果返回s即是要查找的結(jié)點(diǎn)的前一個結(jié)點(diǎn)*/
{
stud *p,*s;
char *y;
p=h->link;
s=h;
while(p!=NULL)
{
y=p->name;
if(strcmp(y,x)==0)
return(s);
else
{
p=p->link;
s=s->link;
}
}
if(p==NULL)
printf("沒有查找到該數(shù)據(jù)!");
}
void del(stud *x,stud *y) /*刪除函數(shù),其中y為要刪除的結(jié)點(diǎn)的指針,x為要刪除的結(jié)點(diǎn)的前一個結(jié)點(diǎn)的指針*/
{
stud *s;
s=y;
x->link=y->link;
free(s);
}
main()
{
int number;
char fullname[20];
stud *head,*searchpoint,*forepoint;
number=N;
head=creat(number);
printf("請輸入你要刪除的人的姓名:");
scanf("%s",fullname);
searchpoint=search(head,fullname);
forepoint=search2(head,fullname);
del(forepoint,searchpoint);
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |