线性表的链式存储
来源:互联网 发布:中国 美国法律 知乎 编辑:程序博客网 时间: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;}
- 线性表的链式存储
- 线性表的链式存储
- 线性表的链式存储
- 线性表的链式存储
- 线性表的链式存储
- 线性表的链式存储
- 线性表的链式存储
- 线性表的链式存储
- 《线性表的链式存储》
- 线性表的链式存储
- 线性表的链式存储
- 线性表的链式存储
- 线性表的链式存储
- 线性表的链式存储
- 线性表的链式存储
- 线性表的链式存储
- 线性表的链式存储
- 线性表的链式存储
- vmware安装ubuntu,ssh连接
- Linux操作系统下不得不知的CLI软件
- QT 与 网页的交互
- android ffmpeg内核 开源播放器编译与使用 支持2.3及4.0
- 软件测试缺陷分析方法简介
- 线性表的链式存储
- linux 得到系统时间
- HTTP协议头部与Keep-Alive模式详解
- 由矩阵运算来看初等矩阵的左乘右乘所影响到矩阵的行列变换的本质
- java设计模式之门面模式
- OSI
- 绘制带箭头的直线
- 实现JNI最简单例子
- 团队介绍