链表的创建与运算

来源:互联网 发布:cocos2d js 官网 编辑:程序博客网 时间:2024/05/19 10:37

本节讲述链表的实现


//头文件
#include "iostream"using namespace std;typedef int ElemType ;#define OK 1;#define TRUE 1;#define ERROR 0;#define FALSE 0;typedef struct LNode{ElemType data;struct LNode *next;}*Link,*Position;typedef struct {Link head,tail;int len;}LinkList;int MakeNode(Link &p,ElemType e);//分配由p指向的值为e的结点void FreeNode(Link &p);//释放p指向的结点int InitList(LinkList &L);//构造一个空的链表Lint DestoryList(LinkList &L);//销毁链表L,L不再存在int ClearList(LinkList &L);//将链表置空,并释放原链表的结点空间int InsFirst(LinkList &L,Link s);//将s所指结点插入到第一个结点之前(h指向头结点)Link DelFirst(LinkList &L,Link &q);//删除链表中的第一个结点并用q返回(h指向头结点)int Append(LinkList &L,Link s);//将指针s所指的一串结点链接在链表L的最后一个结点上,并改变L的尾指针指向新的尾结点Link Remove (LinkList &L,Link &q);//删除链表L的尾结点并以q返回,改变L的尾指针指向新的尾结点int InsBefore(LinkList &L,Link &p,Link s);//p指向链表L中的一个结点,将s所指向的结点插入到p所指结点的前面//并修改指针p指向新插入的结点int InsAfter(LinkList &L,Link &p,Link s);//p指向链表L中的一个结点,将s所指向的结点插入到p所指结点的后面//并修改指针p指向新插入的结点int is_In(LinkList &L,Link p);//判断p所指向的结点是否在链表L中int SetCurElem(Link &p,ElemType e);//p指向链表L中的一个结点,用e更新p所指结点中数据元素的值ElemType GetElem(Link p);//p指向链表L中的一个结点,返回p所指结点中数据元素的值int ListEmpty (LinkList L);//链表L是否为空int ListLength(LinkList L);//返回链表中元素个数Position GetHead(LinkList L);//返回链表L的头结点位置Position GetLast(LinkList L);//返链表L的最后一个结点的位回置Position PriorPos (LinkList L,Link p);//p指向链表L中的一个结点,返回p所指结点的前驱位置,若无前驱,则返回NULLPosition NextPos (LinkList L,Link p);//p指向链表L中的一个结点,返回p所指结点的后继位置,若无后继,则返回NULLint LocatePos (LinkList L,int i,Link &p);//用p返回链表中第i个结点Position LocateElem (LinkList L,ElemType e,int (*compare)(ElemType,ElemType));//返回链表L中的第一个与e 满足compare()判定关系的元素的位置,若不存在,则返回NULLint ListTraverse(LinkList L,int (*visit)(Link));//依次对L中的每个元素调用visit()int visit(Link);int equals(ElemType e1,ElemType e2);int less_than(ElemType e1,ElemType e2);int more_than(ElemType e1,ElemType e2);

源文件

// ListNode.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "ListNode_h.h"int MakeNode(Link &p,ElemType e){p = (LNode*)malloc(sizeof (LNode));if (!p){exit(OVERFLOW);}p->data = e;p->next = NULL;return OK;}void FreeNode(Link &p){free(p);}int InitList(LinkList &L){Link p;p = (LNode*)malloc (sizeof (LNode));if (!p){exit(OVERFLOW);}p->data =NULL;p->next = NULL;L.head = p;L.tail = p;L.len = NULL;return OK;}int DestoryList(LinkList &L){Link p = L.head;Link q = L.head->next;while (q!=NULL){p->next = q->next;free(q);}free(L.head);free(L.tail);return OK;}int ClearList(LinkList &L){Link p = L.head;Link q = L.head->next;while (q!=NULL){p->next = q->next;free(q);}return OK;}int InsFirst(LinkList &L,Link s){Link h = L.head;if (h->next == NULL){h->next = s;s->next = NULL;}else{s->next = h->next;h->next = s;}L.len++;return OK;}Link DelFirst(LinkList &L,Link &q){L.len--;Link h = L.head;Link p = h->next;if (h->next == NULL)return NULL;else if (p->next == NULL){q = p;q->next = NULL;h->next = NULL;L.tail = h;return q;}else{q = h->next;h->next = p->next;q->next = NULL;return q;} }int Append(LinkList &L,Link s){int i = 1;if (L.head->next == NULL){L.head->next = s;L.tail = s;}else{L.tail->next = s;L.tail = L.tail->next;}while (s->next!=NULL){L.tail = s->next;s = s->next;i++;}L.len += i;return OK;}int ListEmpty (LinkList L){if (L.head->next==NULL&&L.tail->next==NULL){return TRUE;}//if ((L.head!=NULL)&&(L.tail!=NULL)) else{return FALSE;}}Link Remove (LinkList &L,Link &q){Link p = L.head->next;if (ListEmpty(L)){return FALSE;}else{while (p->next!=L.tail)p = p->next;q = L.tail;p ->next = NULL;L.tail = p;L.len--;return q;}}int InsBefore(LinkList &L,Link &p,Link s){Link q = L.head;while (q->next != p)q = q->next;s->next = p;q->next = s;return OK;}int InsAfter(LinkList &L,Link &p,Link s){if (p->next == NULL){p->next = s;L.tail = s;}else{s->next = p->next;p->next = s;}return OK;}int is_In(LinkList &L,Link p){Link q = L.head ->next;while((q != p) &&(q != NULL)){q = q->next;}if (q != NULL){return TRUE;}else {return FALSE;}}int SetCurElem(Link &p,ElemType e){p->data = e;return OK;}ElemType GetElem(Link p){return p->data;}int ListLength(LinkList L){return L.len;}Position GetHead(LinkList L){return L.head;}int LocatePos (LinkList L,int i,Link &p){int j = 1;Link q = L.head ->next;if (i<=0||i>L.len){return ERROR;}else {while (j != i){q = q -> next;j++;}p = q;}return OK;}Position LocateElem(LinkList L,ElemType e,int (*compare)(ElemType,ElemType)){Link p = L.head ->next;while ((!compare(p->data,e))&&(p->next!=NULL)){p = p->next;}if (p->next!=NULL){return p;}else{return NULL;}}int equals(ElemType e1,ElemType e2){if (e1==e2){return OK;}else{return FALSE;}}int less_than(ElemType e1,ElemType e2){if (e1<=e2){return OK;}else{return FALSE;}}int more_than(ElemType e1,ElemType e2){if (e1>=e2){return OK;}else{return FALSE;}}int ListTraverse(LinkList L,int (*visit)(Link)){Link p = L.head->next;while (p!=NULL){visit(p);p = p->next;}cout<<endl;return OK;}int visit(Link p){cout<<p->data<<" ";return OK;}


原创粉丝点击