/* * Copyright (c) leo * All rights reserved. * filename: LinkList.h * summary : 单链表(带头结点)头文件 * version : 1.0 * author : leo * date : 6.10.2011 */ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int ElemType; struct LNode; typedef struct LNode *pLNode; typedef struct LNode { ElemType data; struct LNode * next; }LNode, *LinkList; /* 创建一个带头结点的空单链表 */ LinkList CreateList_Link(void); /* 创建一个带头结点的空单链表 */ LinkList CreateList_Link(LinkList &L); /* 逆序输入n个元素的值,创建一个带头结点的单链表 */ LinkList CreateList_Link(int n); /* 逆序输入n个元素的值,创建一个带头结点的单链表 */ LinkList CreateList_Link(LinkList &L, int n); /* 顺序输入n个元素的值,创建一个带头结点的单链表 *此算法复杂度为O(n) */ LinkList CreateList_Link_seq(LinkList &L, int n); /*当第i个元素存在时,其值赋给e,返回OK,否则返回ERROR*/ Status GetElem_Link(const LinkList &L, int i, ElemType &e); /*定位元素e,如果存在则返回指向它的指针*/ pLNode LocateElem(LinkList &L, const ElemType &e); /*定位第i个元素,返回指向它的指针,并用e返回它的值*/ pLNode LocateElem(LinkList &L, int i, ElemType &e); /*在单链表第i个位置前插入元素e*/ Status ListInsert_link(LinkList &L, int i, const ElemType &e); /*删除第i个元素*/ Status ListDelete_Link(LinkList &L, int i); /*删除第i个元素,并用e返回其值*/ Status ListDelete_Link(LinkList &L, int i, ElemType &e); /*依次对L的每个结点调用函数visit(),一旦visit()失败,操作失败*/ Status ListTraverse(const LinkList &L,Status (* visit)(pLNode e)); /*输出结点p的数据*/ Status printNode(pLNode p); /* * Copyright (c) leo * All rights reserved. * filename: LinkList.cpp * summary : 单链表(带头结点) 的实现 * version : 1.0 * author : leo * date : 6.10.2011 */ #include <stdio.h> #include <stdlib.h> #include "LinkList.h" /* 创建一个带头结点的空单链表 */ LinkList CreateList_Link(void) { LinkList L; L = (LinkList)malloc(sizeof(LNode)); if(NULL != L) L->next = NULL; return L; }//CreateList_Link /* 创建一个带头结点的空单链表 */ LinkList CreateList_Link(LinkList &L) { L = (LinkList)malloc(sizeof(LNode)); if(NULL != L) L->next = NULL; return L; }//CreateList_Link /* 逆序输入n个元素的值,创建一个带头结点的单链表 *此算法复杂度为O(n) */ LinkList CreateList_Link(int n) { LinkList L; L = (LinkList)malloc(sizeof(LNode)); if(NULL != L) L->next = NULL; for(int i=n; i>0; --i) { pLNode p = (LinkList)malloc(sizeof(LNode)); scanf("%d",&p->data); //此句应该根据ElemType的实际类型更改 p->next = L->next; L->next = p; } return L; }//CreateList_Link /* 逆序输入n个元素的值,创建一个带头结点的单链表 *此算法复杂度为O(n) */ LinkList CreateList_Link(LinkList &L, int n) { L = (LinkList)malloc(sizeof(LNode)); if(NULL != L) L->next = NULL; for(int i=n; i>0; --i) { pLNode p = (LinkList)malloc(sizeof(LNode)); scanf("%d",&p->data); //此句应该根据ElemType的实际类型更改 p->next = L->next; L->next = p; } return L; }//CreateList_Link /* 顺序输入n个元素的值,创建一个带头结点的单链表 *此算法复杂度为O(n) */ LinkList CreateList_Link_seq(LinkList &L, int n) { L = (LinkList)malloc(sizeof(LNode)); if(NULL != L) L->next = NULL; pLNode p = L; for(int i=n; i>0; --i) { pLNode q = (LinkList)malloc(sizeof(LNode)); scanf("%d",&q->data); //此句应该根据ElemType的实际类型更改 p->next = q; p = q; } p->next = NULL; //最后一个结点的指针置空 return L; }//CreateList_Link /*当第i个元素存在时,其值赋给e,返回OK,否则返回ERROR *此算法复杂度为O(n) */ Status GetElem_Link(const LinkList &L, int i, ElemType &e) { pLNode p = L->next; int j = 1; while(p && j<i) { p = p->next; ++j; } if(!p || j>i) //p==NULL则i大于链表长度,j>i则i<1 return ERROR; e = p->data; return OK; }//GetElem_Link /*定位元素e,如果存在则返回指向它的指针 *此算法复杂度为O(n) */ pLNode LocateElem(LinkList &L, const ElemType &e) { pLNode p = L->next; while(NULL != p) { if(p->data == e) break; p = p->next; } return p; }//LocateElem /*定位第i个元素,返回指向它的指针,并用e返回它的值 *此算法复杂度为O(n) */ pLNode LocateElem(LinkList &L, int i, ElemType &e) { pLNode p = L->next; for(int j=1; j<i; j++) { p = p->next; } if(!p || j>i) return NULL; else { e = p->data; return p; } }//LocateElem /*在单链表第i个位置前插入元素e, 0<i<ListLength+1 *此算法复杂度为O(n) */ Status ListInsert_link(LinkList &L, int i, const ElemType &e) { pLNode p = L; int j = 0; while(p && j<i-1) //寻找第i-1个结点 { p = p->next; ++j; } if(!p || j>i-1) //i < 1 || i > ListLength+1 return ERROR; pLNode s = (pLNode)malloc(sizeof(LNode)); s->data = e; s->next = p->next; p->next = s; return OK; }//ListInsert_link /*删除第i个元素 *此算法复杂度为O(n) */ Status ListDelete_Link(LinkList &L, int i) { pLNode p = L; int j = 0; while(p->next && j<i-1) //此处p->next或p均可 { p = p->next; ++j; } if(!(p->next) || j>i-1)//此处只能是p->next return ERROR; pLNode q = p->next; p->next = q->next; free(q); return OK; }//ListDelete_Link /*删除第i个元素,并用e返回其值 *此算法复杂度为O(n) */ Status ListDelete_Link(LinkList &L, int i, ElemType &e) { pLNode p = L; int j = 0; while(p->next && j<i-1) { p = p->next; ++j; } if(!(p->next) || j>i-1) return ERROR; pLNode q = p->next; p->next = q->next; e = q->data; free(q); return OK; }//ListDelete_Link /*依次对L的每个结点调用函数visit(),一旦visit()失败,操作失败*/ Status ListTraverse(const LinkList &L,Status (* visit)(pLNode e)) { pLNode p = L->next; while(NULL != p) { if(!(*visit)(p)) return ERROR; p = p->next; } return OK; }//ListTraverse /*输出结点p的数据*/ Status printNode(pLNode p) { if(NULL != p) printf("%d ",p->data); else return ERROR; return OK; }//printNode