線性表的鏈式存儲

"Common.h"

#ifndef COMMON_H_INCLUDED
#define COMMON_H_INCLUDED

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

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;
typedef int ElemType;

#endif // COMMON_H_INCLUDED

"List_Linked.h"

#ifndef LIST_LINKED_H_INCLUDED
#define LIST_LINKED_H_INCLUDED

#include "Common.h"

typedef struct LNode {//結點類型
    ElemType data;
    struct LNode * next;
} Link, * Position;

typedef struct {//鏈表類型
    Link * head;
    Link * tail;
    int len;
} LinkList;

Status MakeNode_Linked(Link * p, ElemType e);
void FreeNode_Linked(Link * p);

Status InitList_Linked(LinkList * l);
Status DestroyList_Linked(LinkList * l);
Status ClearList_Linked(LinkList * l);
Status InsFirst_Linked(LinkList * l, Link * s);//h爲頭結點,s爲所指結點,s插入到第一個結點前
Status DelFirst_Linked(LinkList * l, Link * q);
Status Append_Linked(LinkList * l, Link * s);//將s所指一串結點鏈接在list的最後一個結點並修改list尾指針
Status Remove_Linked(LinkList * l, Link * q);//刪除尾結點,以q返回,改變list尾指針
Status InsBefore_Linked(LinkList * l, Link * p, Link * s);//在p指向的結點前插入結點s,修改指針p指向新插入的結點
Status InsAfter_Linked(LinkList * l, Link * p, Link * s);
Status SetCurElem_Linked(Link * p, ElemType e);//用e更新p的值
ElemType GetCurElem_Linked(Link p);
Status ListEmpty_Linked(LinkList * l);
int ListLength_Linked(LinkList * l);
Position GetHead_Linked(LinkList * l);
Position GetLast_Linked(LinkList * l);
Position PriorPos_Linked(LinkList * l, Link * p);//返回p的前驅
Position NextPos_Linked(LinkList * l, Link * p);
Status LocatePos_Linked(LinkList * l, int i, Link * p);//p返回list中第i個結點的位置
Position LocateElem_Linked(LinkList * l, ElemType e);//返回list中與e相等的元素的位置
Status ListTraverse_Linked(LinkList * l);

#endif // LIST_LINKED_H_INCLUDED

"List_Linked.c"

#include "List_Linked.h"

Status MakeNode_Linked(Link * p, ElemType e)
{
    p->data = e;
    p->next = NULL;
    return OK;
}
void FreeNode_Linked(Link * p)
{
    free(p);
}

Status InitList_Linked(LinkList * l)
{
    l->head = (Link *)malloc(sizeof(Link));
    l->tail = (Link *)malloc(sizeof(Link));
    if(!l->head || !l->tail)
        exit(OVERFLOW);
    l->len = 0;
    l->head = l->tail;
    l->tail->next = NULL;
    return OK;
}
Status DestroyList_Linked(LinkList * l)
{
    ClearList_Linked(l);
    free(l->head);
    l->tail = NULL;
    l->len = 0;
    l = NULL;
    return OK;
}
Status ClearList_Linked(LinkList * l)
{
    Link * temp;
    Link * temp2;
    if(l->head != l->tail)
    {
        temp = l->head->next;
        l->head->next = NULL;
        l->len = 0;
        while(temp != l->tail)
        {
            temp2 = temp->next;
            free(temp);
            temp = temp2;
        }
        free(temp);
        l->tail = l->head;
    }
    return OK;
}

Status InsFirst_Linked(LinkList * l, Link * s)//h爲頭結點,s爲所指結點,s插入到第一個結點前
{
    Link * h = l->head;
    if(h != l->tail)
    {
        s->next = h->next;
    }
    else
    {
        s->next = NULL;
        l->tail = s;
    }
    h->next = s;
    l->len++;
    return OK;
}

Status DelFirst_Linked(LinkList * l, Link * q)
{
    if(l->head != l->tail)
    {
        q = l->head->next;
        if(!q->next)
        {
            l->tail = l->head;
        }
        else
        {
            l->head->next = q->next;
        }

        l->len--;
        return OK;
    }
    else
    {
        return ERROR;
    }
}
Status Append_Linked(LinkList * l, Link * s)//將s所指一串結點鏈接在list的最後一個結點並修改list尾指針
{
    Link * temp = l->tail;
    temp->next = s;
    int i = 1;
    while(temp->next)
    {
        temp = temp->next;
        i++;
    }
    l->len += i;
    l->tail = temp;
    return OK;
}
Status Remove_Linked(LinkList * l, Link * q)//刪除尾結點,以q返回,改變list尾指針
{
    Link * temp = l->head;
    while(temp->next->next)
    {
        temp = temp->next;
    }
    *q = *temp->next;
    l->tail = temp;
    l->tail->next = NULL;
    printf("%d  ", q->data);
    return OK;
}
Status InsBefore_Linked(LinkList * l, Link * p, Link * s)//在p指向的結點前插入結點s,修改指針p指向新插入的結點
{
    Link * temp = l->head;
    while(temp->next && temp->next != p)
    {
        temp = temp->next;
    }
    s->next = p;
    temp->next = s;
    l->len++;
    return OK;
}
Status InsAfter_Linked(LinkList * l, Link * p, Link * s)
{
    s->next = p->next;
    p->next = s;
    if(p == l->tail)
    {
        l->tail = s;
    }
    l->len++;
    return OK;
}
Status SetCurElem_Linked(Link * p, ElemType e)//用e更新p的值
{
    p->data = e;
    return OK;
}
ElemType GetCurElem_Linked(Link p)
{
    return p.data;
}
Status ListEmpty_Linked(LinkList * l)
{
    if(l->head == l->tail)
        return TRUE;
    else
        return FALSE;
}
int ListLength_Linked(LinkList * l)
{
    return l->len;
}
Position GetHead_Linked(LinkList * l)
{
    return l->head;
}
Position GetLast_Linked(LinkList * l)
{
    return l->tail;
}
Position PriorPos_Linked(LinkList * l, Link * p)//返回p的前驅
{
    Link * temp = l->head;
    while(temp && temp->next!=p)
        temp = temp->next;
    return temp;
}
Position NextPos_Linked(LinkList * l, Link * p)
{
    return p->next;
}
Status LocatePos_Linked(LinkList * l, int i, Link * p)//p返回list中第i個結點的位置
{
    if(i<1 || i>ListLength_Linked(l))
    {
        return ERROR;
    }
    int j;
    Link * temp = l->head;
    for(j=0; j<i; j++)
    {
        temp = temp->next;
    }
    *p = *temp;
    return OK;
}
Position LocateElem_Linked(LinkList * l, ElemType e)//返回list中與e相等的元素的位置
{
    Link * temp = l->head;
    while(temp)
    {
        if(temp->data == e)
            return temp;
        temp = temp->next;
    }
    return NULL;
}
Status ListTraverse_Linked(LinkList * l)
{
    if(l->len != 0)
    {
        Link * temp = l->head->next;
        while(temp)
        {
            printf("%d  ", temp->data);
            temp = temp->next;
        }
    }
    return OK;

}


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