1. 程式人生 > >數據結構(二)線性表——鏈表

數據結構(二)線性表——鏈表

erro urn 找到 頭結點 tee 存在 結構 strong 函數

通常情況下,鏈接可分為單鏈表、雙向鏈表和循環鏈表三種常用類型。

一、單鏈表基本操作的實現

使用鏈式存儲結構來實現的線性表稱為鏈表。首元結點、頭結點、頭指針、空指針。

1.單鏈表的類型定義

typedef struct LNode//結點類型 
{
    LElemType data;//數據域 
    struct LNode * next;//指針域 
} LNode, * LinkList;

2.初始化操作InitLinkList(&L)

Status InitLinkList(LinkList &L)
{
    //創建空的帶頭結點的單鏈表L
    L=(LinkList)malloc
(sizeof(LNode));//申請頭結點 if(!F) return OVERFLOW;//若失敗 L->next=NULL;//頭結點的後繼指針域賦為NULL return OK; }

3.求表長操作listLength(&L)

int listLength(LinkList L)
{
    LNode *p=L;//p指向頭結點 
    int j=0;
    while(p->next)//當存在 
    {
        p=p->next;//指針後移,指向後繼 
        j++;
    }
    return j;//返回計數器 
}

4.取元素操作getElem(LinkList L,int i,LElemType &e)

Status getElem(LinkList L,int i,LElemType &e)
{
    LNode *p=L;
    int j=0;
    while(j<i&&p->next)//不為i結點,且不為最後一個 
    {
        p=p->next;//向後查找 
        j++;
    } 
    if(j==i)//若找到 
    {
        e=p->data;//由e返回其值 
        return
OK; } else return ERROR;//若沒找到,返回ERROR }

5.按值查找locateElem(L,e)

LinkList locateElem(LinkList L,LElemType e)
{
    LNode *p=L->next;//p指向第一個結點 
    while(p&&!equal(p->data,e))//若不等於e 
        p=p->next;//向後查找 
    if(p) return p;//找到 
    else return NULL;//沒找到 
} 

6.插入操作listInsert(&L,i,e)

Status listInsert(LinkList &L,int i,LElemType e)
{
    //在單鏈表L的第i個位置插入一個值為e的結點
    LNode *p=L,*q;//q用於指向想要插入的結點 
    int j=0;
    while(j<i-1&&p->next)
    {
        p=p->next;
        j++;
    } 
    if(j==i-1)//在j後插入新結點 
    {
        q=(LNode *)malloc(sizeof(LNode));//生成新結點
        if(!q) return OVERFLOW;
        q->data=e;
        q->next=p->next;
        p->next=q;
        return OK; 
    }
    else return ERROR;
} 

7.刪除操作listDelete(&L,i,&e)

Status listDelete(LinkList &L,int i,LElemType &e)
{
    LNode *p=L,*q;
    int j=0;
    while(j<i-1&&p->next)
    {
        p=p->next;
        j++; 
    }
    if(j==i-1&&p->next)//判斷i結點是否存在 
    {
        q=p->next;
        p->next=q->next;
        e=q->data;//由e返回刪除元素的值 
        free(q);
    } 
    else return ERROR; 
} 

8.頭插法建立單鏈表操作createList(&L,n)

void createList(LinkList &L,int n)
{
    //依次讀入n個元素,建立單鏈表L 
    LNode *p;
    int i;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    for(i=1;i<=n;i++)
    {
        p=(LNode *)malloc(sizeof(LNode));//生成p結點
        inputListElem(p->data);//調用元素讀入函數 
        p->next=L->next;
        L->next=P; 
    }
}

9.尾插法建立單鏈表操作createList(&L,n)

void createList(LinkList &L,int n)
{
    //依次讀入n個元素,建立單鏈表L 
    LNode *p,*r;
    int i;
    L=(LinkList)malloc(sizeof(LNode));//生成頭結點 
    r=L;//尾指針r指向頭結點 
    for(i=1;i<=n;i++)
    {
        p=(LNode *)malloc(sizeof(LNode));//生成p結點
        inputListElem(p->data);//調用元素讀入函數,讀入p結點的值 
        r->next=p;//把p結點放到r結點後,尾 
        r=p; //重置r 
    }
    r->next=NULL; //最後一個結點後繼指針為空 
}

二、單鏈表實例——約瑟夫環問題

1.問題描述:

設編號為1、2、3...、n的n個人圍坐一圈,約定從編號為k(1=<k=<n)的人開始從1報數,數到m的那個人出列,它的下一位又從1開始報數,數到m的人出列,以此類推,直到所有人都出列為止,由此產生一個編號序列。

2.算法描述:

數據結構(二)線性表——鏈表