线性表的链式存储

来源:互联网 发布:中国 美国法律 知乎 编辑:程序博客网 时间:2024/04/30 02:37

"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 -2typedef 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;}


原创粉丝点击