單鏈表的表示,循環鏈表等

//方法1:
typedef struct Lnode*pointer;
struct LNode
{
    ElemType data;//數據域
    pointer next;//指針域
};
typedef pointer LinkList;
//方法2:
typedef struct LNode
{
    ElemType data;//數據域
    structLNode *next;//指針域
}LNode*LinkList;//LNode(結構體了類型),LinkList(結構體指針類型)都是類型名
 

2.單鏈的查詢操作

  • 按序號進行查找

//按序號查找(單鏈表)
Status GetElem_Lk(LinkList L,int i,ElemType &e)
//在帶頭結點的單鏈表L中查找第i個元素
{
    p = L->next;j = 1;
    while(p != NULL && j<i)
    {
        p = p->next;
        j++;
    }
    if(p == NULL || j>i)
        return ERROR;
    e = p->data;
    return OK;
}

  • 按元素值進行查找

LNode *LocateElem_Lk(LinkList L,ElemType x)
//在帶頭結點的單鏈表L中查找值爲x的元素
{
    p = L->next;
    while(p != NULL && p->data != x)
        p = p->next;
    return p;
}

3.單鏈表的插入操作

Status Insert_L(LinkList &L,int i,ElemType x)
{
    P = L;j = 0;
    while(p != NULL && j<i-1)
    {
        p = p->next;
        j++;
    }
    if(p == NULL || j>i-1)
        return ERROR;
    s = new LNode;//申請結點空間
    s->data = x;
    s->next = p->next;
    p->next = s;
    return OK;
}

4.單鏈表的刪除

Status Delete_L(LinkList &L,int i,ElemType &x)
{
    p = L;j = 0;
    while(p->next != NULL && j<i-1)
    {
        p = p->next;
        j++;
    }
    if(p->next == NULL || j>i-1)
        return ERROR;
    s = p->next;//s指向被刪除結點
    p->next = s->next;//修改被刪除結點前驅指針域的值
    x = s->data;//將被刪除結點的值保存到變量x中
    delete s;//釋放被刪除結點的空間
    return OK;
}

5.創建單鏈表


//前插法創建單鏈表
void Create_L_F(LinkList &L,int n)
//逆序輸入n個元素的值,建立帶頭結點的單鏈表L
{
    L = new LNode;//申請結點空間作爲單鏈表的表頭結點
    L->next = NULL;//將表頭結點的指針域置空
    for(i = 1;i <= n;i++)
    {
        cin>>x;//輸入元素x
        s->data = x;//將x存入s結點中
        s->next = L-next;L->next = s;//將s插入到表頭
    }
}

//後插法創建單鏈表
void Create_L_L(LinkList &L,int n)
//順序插入n個元素的值,建立帶頭結點的單鏈表L
{
    L = newLNode;//申請結點空間
    L->next = NULL;//將表頭結點的指針域置空
    r = L;//尾指針r指向頭結點
    for(i = 1;i <= n;i++)
    {
        cin>>x;//輸入元素s
        s->data = x;//將x存入s結點中
        s->next = NULL;r->next = s;//將s插入到表尾
        r = s;//r指向新的尾結點
    }
}

 

6.循環鏈表的定義

//頭尾指針 

void join1(CLinkList &L1,CLinkList L2)
{
    p = L1;
    while(p->next != L1)//n次
        p = p->next;
    p->next = L2->next;
    while(p->next != L2)//m次
        p = p->next;
    p->next = L1;
    delete L2;
}

時間複雜度爲O(m+n)

//兩個尾指針的算法
void union1(CLinkList &r1,CLinkList r2)
{
    L1 = r1->next;
    L2 = r2->next;
    r1->next = L2->next;
    r2->next = L1;
    delete L2;
    r1 = r2;
}

時間複雜度爲O(1)

 

7.雙向鏈表的存儲結構

typedef struct DLNode{
    ElemType data;
    struct DLNode *prior;
    struct DLNode *next;
}DLNode,*DLinkList;

 

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