C语言线性非循环单链表

来源:互联网 发布:mac office 2016 破解 编辑:程序博客网 时间:2024/06/10 03:32
#include <stdio.h>#include <stdlib.h>#define OVERFLOW 0#define ERROR -1#define OK 1#define FALSE 0#define TRUE 1typedef int ElemType;typedef int Status;typedef struct LNode{ElemType data;LNode *next;}LNode, *LinkList;//struct LNode *LinkList;void InitList(LinkList &L){L = (LinkList)malloc(sizeof(LNode));if(!L){exit(OVERFLOW);}L->next = NULL;}void DestroyList(LinkList &L){LinkList q;while(L){q = L->next;free(L);L = q;}L = NULL;}void ClearList(LinkList L){LinkList p = L->next;L->next = NULL;DestroyList(p);}Status ListEmpty(LinkList L){if(L->next)return FALSE;elsereturn TRUE;}int ListLength(LinkList L){int i = 0;LinkList p = L->next;while(p){i++;p = p->next;}return i;}Status InsertList(LinkList L, int i, ElemType e){int j = 0;LinkList p = L;while(p && j < i - 1){p = p->next;j++;}if(!p || j > i - 1){return ERROR;}LinkList s = (LinkList)malloc(sizeof(LNode));if(!s){exit(OVERFLOW);}s->data = e;s->next = p->next;p->next = s;return OK;}Status GetElem(LinkList L, int i, ElemType &e){int j = 1;LinkList p = L->next;while(p && j < i){j++;p = p->next;}if(!p || j > i){return ERROR;}e = p->data;return OK;}int LocateElem(LinkList L, ElemType e){int i = 0;LinkList p = L->next;while(p){i++;if(p->data == e)return i;p = p->next;}return 0;}Status DeleteList(LinkList L, int i, ElemType &e){int j = 0;LinkList p = L;while(p && j < i - 1){p = p->next;j++;}if(!p->next || j > i - 1){exit(OVERFLOW);}LinkList q = p->next;e = q->data;//e = p ->next->data;p->next = q->next;//p->next = p->next->next;free(q);return OK;}void print(ElemType e){printf("%d ", e);}void ListTraverse(LinkList L, void(*visit)(ElemType)){LinkList p = L->next;while(p){visit(p->data);p = p->next;}printf("\n");}int main(){LinkList L;InitList(L);InsertList(L, 1, 1);InsertList(L, 1, 2);InsertList(L, 1, 3);InsertList(L, 1, 4);InsertList(L, 1, 5);ListTraverse(L, print);printf("length = %d\n", ListLength(L));printf("Locate(4): %d\n", LocateElem(L, 4));ElemType e;if(OK == GetElem(L, 2, e)){printf("Get(2): %d\n", e);}else{printf("error!\n");}if(OK == DeleteList(L, 4, e)){printf("delete: %d\n", e);}else{printf("delete fail\n");}ListTraverse(L, print);printf("length = %d\n", ListLength(L));ClearList(L);ListTraverse(L, print);DestroyList(L);return 0;}


原创粉丝点击