您的位置:首页 > 其它

线性表的链式存储

2013-03-04 17:09 288 查看
"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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: