鏈表的C語言實(shí)現(xiàn)之刪除結(jié)點(diǎn)

字號(hào):

假如我們已經(jīng)知道了要?jiǎng)h除的結(jié)點(diǎn)p的位置,那么要?jiǎng)h除p結(jié)點(diǎn)時(shí)只要令p結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)的鏈域由存儲(chǔ)p結(jié)點(diǎn)的地址該為存儲(chǔ)p的后繼結(jié)點(diǎn)的地址,并回收p結(jié)點(diǎn)即可。
    以下便是應(yīng)用刪除算法的實(shí)例:
    #include <stdio.h>
    #include <malloc.h>
    #include <string.h>
    #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<n;i++)
    {
    if((s= (stud *) malloc(sizeof(stud)))==NULL)
    {
    printf("不能分配內(nèi)存空間!");
    exit(0);
    }
    p->link=s;
    printf("請(qǐng)輸入第%d個(gè)人的姓名",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) /*另一個(gè)查找函數(shù),返回的是上一個(gè)查找函數(shù)的直接前驅(qū)結(jié)點(diǎn)的指針,*/
    /*h為表頭指針,x為指向要查找的姓名的指針*/
    /*其實(shí)此函數(shù)的算法與上面的查找算法是一樣的,只是多了一個(gè)指針s,并且s總是指向指針p所指向的結(jié)點(diǎn)的直接前驅(qū),*/
    /*結(jié)果返回s即是要查找的結(jié)點(diǎn)的前一個(gè)結(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ǎng)h除的結(jié)點(diǎn)的指針,x為要?jiǎng)h除的結(jié)點(diǎn)的前一個(gè)結(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("請(qǐng)輸入你要?jiǎng)h除的人的姓名:");
    scanf("%s",fullname);
    searchpoint=search(head,fullname);
    forepoint=search2(head,fullname);
    del(forepoint,searchpoint);
    }