鏈表的C語言實現(xiàn)之單鏈表的查找運(yùn)算

字號:

建立了一個單鏈表之后,如果要進(jìn)行一些如插入、刪除等操作該怎么辦?所以還須掌握一些單鏈表的基本算法,來實現(xiàn)這些操作。單鏈表的基本運(yùn)算包括:查找、插入和刪除。下面我們就一一介紹這三種基本運(yùn)算的算法,并結(jié)合我們建立單鏈表的例子寫出相應(yīng)的程序。
    1、查找
    對單鏈表進(jìn)行查找的思路為:對單鏈表的結(jié)點依次掃描,檢測其數(shù)據(jù)域是否是我們所要查好的值,若是返回該結(jié)點的指針,否則返回NULL。
    因為在單鏈表的鏈域中包含了后繼結(jié)點的存儲地址,所以當(dāng)我們實現(xiàn)的時候,只要知道該單鏈表的頭指針,即可依次對每個結(jié)點的數(shù)據(jù)域進(jìn)行檢測。
    以下是應(yīng)用查找算法的一個例子:
    #include <stdio.h>
    #include <malloc.h>
    #include <string.h> /*包含一些字符串處理函數(shù)的頭文件*/
    #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("請輸入第%d個人的姓名",i+1);
    scanf("%s",s->name);
    s->link=NULL;
    p=s;
    }
    return(h);
    }
    stud * search(stud *h,char *x) /*查找鏈表的函數(shù),其中h指針是鏈表的表頭指針,x指針是要查找的人的姓名*/
    {
    stud *p; /*當(dāng)前指針,指向要與所查找的姓名比較的結(jié)點*/
    char *y; /*保存結(jié)點數(shù)據(jù)域內(nèi)姓名的指針*/
    p=h->link;
    while(p!=NULL)
    {
    y=p->name;
    if(strcmp(y,x)==0) /*把數(shù)據(jù)域里的姓名與所要查找的姓名比較,若相同則返回0,即條件成立*/
    return(p); /*返回與所要查找結(jié)點的地址*/
    else p=p->link;
    }
    if(p==NULL)
    printf("沒有查找到該數(shù)據(jù)!");
    }
    main()
    {
    int number;
    char fullname[20];
    stud *head,*searchpoint; /*head是表頭指針,searchpoint是保存符合條件的結(jié)點地址的指針*/
    number=N;
    head=creat(number);
    printf("請輸入你要查找的人的姓名:");
    scanf("%s",fullname);
    searchpoint=search(head,fullname); /*調(diào)用查找函數(shù),并把結(jié)果賦給searchpoint指針*/
    }