1. 程式人生 > >線性表的鏈式存貯及實現

線性表的鏈式存貯及實現

#include "stdafx.h"

#include 
<stdio.h>
#include 
<stdlib.h>

#define NN 5
#define MM 20

typedef 
int elemType ;

/************************************************************************/
/*             以下是關於線性錶鏈接儲存(單鏈表)操作的16種演算法        */
/***********************************************************************
*/

struct sNode{    /* 定義單鏈表結點型別 */
    elemType data;
    
struct sNode *next;
}
;

/* 1.初始化線性表,即置單鏈表的表頭指標為空 */
void initList(struct sNode**hl)
{
    
// 將hl地址對應的內容設定為00 00 00 00
*hl = NULL;
    
return;
}


/* 2.清除線性表L中的所有元素,即釋放單鏈表L中所有的結點,使之成為一個空表 */
void clearList(struct sNode**hl)
{
    
/* cp和np分別作為指向兩個相鄰結點的指標 */
    
struct
 sNode *cp, *np;
    cp 
=*hl;
    
/* 遍歷單鏈表,依次釋放每個結點 */
    
while(cp != NULL){
        np 
= cp->next;    /* 儲存下一個結點的指標 */
        free(cp);
        cp 
= np;
    }

    
*hl = NULL;        /* 置單鏈表的表頭指標為空 */
    
return;
}


/* 3.返回單鏈表的長度 */
int sizeList(struct sNode *hl)
{
    
int count =0;        /* 用於統計結點的個數 
*/

    
while(hl != NULL){
        count
++;
        hl 
= hl->next;
    }

    
return count;
}


/* 4.檢查單鏈表是否為空,若為空則返回1,否則返回0 */
int emptyList(struct sNode *hl)
{
    
if(hl == NULL){
        
return1;
    }
else{
        
return0;
    }

}


/* 5.返回單鏈表中第pos個結點中的元素,若pos超出範圍,則停止程式執行 */
elemType getElem(
struct sNode *hl, int pos)
{
    
int i =0;        /* 統計已遍歷的結點個數 */
    
if(pos <1){
        printf(
"pos值非法,退出執行! ");
        exit(
1);
    }

    
while(hl != NULL){
        i
++;
        
if(i == pos){
            
break;
        }

        hl 
= hl->next;
    }

    
if(hl != NULL){
        
return hl->data;
    }
else{
        printf(
"pos值非法,退出執行! ");
        exit(
1);
    }

}


/* 6.遍歷一個單鏈表 */
void traverseList(struct sNode *hl)
{
    
// 前面連結串列初始化 
while(hl != NULL){
        printf(
"%5d", hl->data);
        hl 
= hl->next;
    }

    printf(
"");
    
return;
}


/* 7.從單鏈表中查詢具有給定值x的第一個元素,若查詢成功則返回該結點data域的儲存地址,否則返回NULL */
elemType
* findList(struct sNode *hl, elemType x)
{
    
while(hl != NULL)