线性表的链式存储
2013-03-04 17:09
288 查看
"Common.h"
"List_Linked.h"
"List_Linked.c"
#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; }
相关文章推荐
- 数据结构:线性表之链式存储结构
- 线性表的链式存储结构之单链表结点类的实现_Java
- 线性表顺序存储与链式存储的比较
- 线性表链式存储
- 03.线性表(二)链式存储结构.单链表1
- Java基础 - 线性表之链式存储结构-循环链表
- 数据结构一一线性表的链式存储结构之删除操作
- 数据结构:线性表的链式存储(双向链表)--Java实现
- 线性结构-栈的顺序存储和链式存储实现
- 2--线性表的链式存储
- 线性表的链式存储(链表)
- 线性表的链式存储API
- 线性表的链式存储
- 线性表的链式存储和实现
- 线性表的链式存储结构学习总结
- 数据结构中链式存储的注意点(线性与栈)
- 线性表的线性存储和链式存储
- 算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)
- 数据结构之线性表——队列的链式存储
- 链式存储线性表(无头节点)