鏈表的操作(純C語言版)


#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "time.h"

#define OK     (1)
#define ERROR  (0)
#define TRUE   (1)
#define FALSE  (0)

#define MAXSIZE 20 /* 存儲空間初始分配量 */

typedef int Status;/* Status是函數的類型,其值是函數結果狀態代碼,如OK等 */
typedef int ElemType;/* ElemType類型根據實際情況而定,這裏假設爲int */


Status visit(ElemType c)
{
    printf("%d ",c);
    return OK;
}

typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node;

typedef struct Node *LinkList; /* 定義LinkList */

/* 初始化順序線性表 */
Status InitList(LinkList *L) 
{ 
    *L=(LinkList)malloc(sizeof(Node)); /* 產生頭結點,並使L指向此頭結點 */
    if(!(*L)) /* 存儲分配失敗 */
    {
        return ERROR;
    }
    (*L)->next=NULL; /* 指針域爲空 */

    return OK;
}

/* 初始條件:順序線性表L已存在。操作結果:若L爲空表,則返回TRUE,否則返回FALSE */
Status IsEmptyList(LinkList L)
{ 
    if(L->next)
    {
        return FALSE;
    }
    else
    {
        return TRUE;
    }
}

/* 初始條件:順序線性表L已存在。操作結果:將L重置爲空表 */
Status ClearList(LinkList *L)
{ 
    LinkList p,q;
    p=(*L)->next;           /*  p指向第一個結點 */
    while(p)                /*  沒到表尾 */
    {
        q = p->next;
        free(p);
        p = q;                /* update operated node */
    }
    (*L)->next = NULL;        /* 頭結點指針域爲空 */
    return OK;
}

/* 初始條件:順序線性表L已存在。操作結果:返回L中數據元素個數 */
int GetListLength(LinkList L)
{
    int i = 0;
    LinkList p = L->next; /* p指向第一個結點 */
    while(p)                        
    {
        i++;
        p = p->next;
    }
    return i;
}

/* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) */
/* 操作結果:用e返回L中第i個數據元素的值 */
Status GetElem(LinkList L,int i,ElemType *pElem)
{
    int j = 1;            /*  j爲計數器 */
    LinkList p;           /* 聲明一結點p */
    p = L->next;          /* 讓p指向鏈表L的第一個結點 */
    while ((p != NULL) && (j < i))  /* p不爲空或者計數器j還沒有等於i時,循環繼續 */
    {   
        p = p->next;      /* 讓p指向下一個結點 */
        ++j;
    }
    if ((!p) || (j > i)) 
    {
        return ERROR;    /*  第i個元素不存在 */
    }
    *pElem = p->data;    /*  取第i個元素的數據 */
    return OK;
}

/* 初始條件:順序線性表L已存在 */
/* 操作結果:返回L中第1個與e滿足關係的數據元素的位序。 */
/* 若這樣的數據元素不存在,則返回值爲0 */
int GetLocationForElem(LinkList L, ElemType e)
{
    int i = 0;
    LinkList p = L->next;
    while(p)
    {
        i++;
        if(p->data == e)                  /* 找到這樣的數據元素 */
                return i;
        p = p->next;
    }
    return 0;
}


/* 初始條件:順序線性表L已存在,1≤i≤ListLength(L), */
/* 操作結果:在L中第i個位置之前插入新的數據元素e,L的長度加1 */
Status InsertListNode(LinkList *L, int i, ElemType e)
{ 
    int j;
    LinkList p,s;
    p = *L;
    j = 1;
    while ((p != NULL) && (j < i))       /* 尋找第i個結點 */
    {
        p = p->next;
        ++j;
    } 
    if (!p || (j > i))
    {
        return ERROR;                    /* 第i個元素不存在 */
    }
    s = (LinkList)malloc(sizeof(Node));  /*  生成新結點(C語言標準函數) */
    s->data = e;  
    s->next = p->next;                   /* 將p的後繼結點賦值給s的後繼  */
    p->next = s;                         /* 將s賦值給p的後繼 */
    return OK;
}

/* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) */
/* 操作結果:刪除L的第i個數據元素,並用e返回其值,L的長度減1 */
Status DeleteListNode(LinkList *L, int i, ElemType *e) 
{ 
    int j = 1;
    LinkList p,q;
    p = *L;
    while ((p->next !=NULL) && (j < i))    /* 遍歷尋找第i個元素 */
    {
        p = p->next;
        ++j;
    }
    if (!(p->next) || j > i) 
    {
        return ERROR;           /* 第i個元素不存在 */
    }
    q = p->next;
    p->next = q->next;          /* 將q的後繼賦值給p的後繼 */
    *e = q->data;               /* 將q結點中的數據給e */
    free(q);                    /* 讓系統回收此結點,釋放內存 */
    return OK;
}

/* 初始條件:順序線性表L已存在 */
/* 操作結果:依次對L的每個數據元素輸出 */
Status ListTraverse(LinkList L)
{
    LinkList p=L->next;
    while(p)
    {
        visit(p->data);
        p=p->next;
    }
    printf("\n");
    return OK;
}

/*  隨機產生n個元素的值,建立帶表頭結點的單鏈線性表L(頭插法) */
void CreateListWithHead(LinkList *L, int n) 
{
    LinkList p;
    int i;
    srand(time(0));         /* 初始化隨機數種子 */
    *L = (LinkList)malloc(sizeof(Node));
    (*L)->next = NULL;      /* 先建立一個帶頭結點的單鏈表 */

    for (i=0; i<n; i++) 
    {
        p = (LinkList)malloc(sizeof(Node)); /*  生成新結點 */
        p->data = (rand() % 100) + 1;       /*  隨機生成100以內的數字 */
        p->next = (*L)->next;    
        (*L)->next = p;                     /*  插入到表頭 */
    }
}

/*  隨機產生n個元素的值,建立帶表頭結點的單鏈線性表L(尾插法) */
void CreateListTail(LinkList *L, int n) 
{
    LinkList p,r;
    int i;
    srand(time(0));                      /* 初始化隨機數種子 */
    *L = (LinkList)malloc(sizeof(Node)); /* L爲整個線性表 */
    r= *L;                               /* r爲指向尾部的結點 */
    for (i=0; i<n; i++) 
    {
        p = (Node *)malloc(sizeof(Node)); /*  生成新結點 */
        p->data = (rand() % 100) + 1;     /*  隨機生成100以內的數字 */
        r->next = p;                      /* 將表尾終端結點的指針指向新結點 */
        r = p;                            /* 將當前的新結點定義爲表尾終端結點 */
    }
    r->next = NULL;                       /* 表示當前鏈表結束 */
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章