数据结构:链表

来源:互联网 发布:360mac版怎么样 编辑:程序博客网 时间:2024/06/14 13:22

经过这几天的练习和做停车场项目,发现链表的应用非常广泛,如果可以用好它,可以解决很多的问题。所以整理一遍链表的内容。  


特点 :


  每个元素(表项)由结点(Node)构成。

  线性结构 。

  结点可以连续,可以不连续存储。

  结点的逻辑顺序与物理顺序可以不一致。

  表可扩充。


#ifndef _LINKLIST_H_#define _LINKLIST_H_#define SUCCESS 1000001#define FAILURE 1000002#define TRUE    1000003#define FALSE   1000004typedef int ElemType;struct node{ElemType data;struct node *next;};typedef struct node Node;typedef Node *LinkList;int ListInit(LinkList *L);int ListInsert(LinkList *L,int i, ElemType e);int ListTraverse(LinkList l,void(*print)(ElemType));int GetElem(LinkList l,int k,ElemType *e);int ListLength(LinkList l);int ListEmpty(LinkList l);int ListDelete(LinkList l,int i,ElemType *e);int ListClean(LinkList l);int ListDestroy(LinkList *l);
#endif


主函数:

#include<stdio.h>#include"linklist.h"void visit(ElemType a){printf("%d ",a);}int main(){int ret,i;int place =0;ElemType e;LinkList list;ret = ListInit(&list);if(FAILURE == ret){printf("Init Failure!\n");}else {printf("Init success!\n");}for(i = 0; i<10; i++){ret = ListInsert(&list,i+1,i+1);if(FAILURE == ret){printf("Insert %d Failure!\n",i+1);}else{printf("Insert %d Success!\n",i+1);}}ret = ListTraverse(list,visit);if(FAILURE == ret){printf("Traverse Failure!\n");}else{printf("Traverse Success!\n");}place = 4;ret = GetElem(list,place,&e);if(FAILURE == ret){printf("Get %dth Failure!\n",place);}else{printf("%dth Element is %d\n",place,e);}ret = ListLength(list);printf("Length is %d\n",ret);ret = ListEmpty(list);if(TRUE == ret){printf("List is Empty!\n");}else{printf("List is't Empty!\n");}place = 3;ret = ListDelete(list,place,&e);if(SUCCESS == ret){printf("Delete %d Success!\n",e);}else{printf("Delete Failure!\n");}ret = ListTraverse(list,visit);if(FAILURE == ret){printf("Traverse Failure!\n");}else{printf("Traverse Success!\n");}/*ret = ListClean(list);if(SUCCESS == ret){printf("Clear Success!\n");}ret = ListLength(list);printf("Length is %d\n",ret);ret = ListDestroy(&list);if(SUCCESS == ret){printf("Destroy Success!\n");}free(list);*/ret = ReverseList(list);if(ret == 1){ ret = ListTraverse(list,visit);if(FAILURE == ret){printf("Traverse Failure!\n");}else{printf("Traverse Success!\n");}}return 0;}

#include<stdio.h>#include"linklist.h"#include<stdlib.h>int ListInit(LinkList *L){(*L) = (LinkList)malloc(sizeof(Node));if(NULL == (*L)){return FAILURE;}(*L)->next = NULL;return SUCCESS;}int ListInsert(LinkList *L,int i,ElemType e){LinkList p = *L;int j = 1;while(p!=NULL&&j<i){p=p->next;j++;}if(p==NULL||j>i){return FAILURE;}LinkList n =(LinkList)malloc(sizeof(Node));if(NULL == n){return FAILURE;}n->data = e;n->next = p->next;p->next = n;}int ListTraverse(LinkList l,void(*print)(ElemType)){if(NULL == l){return FAILURE;}LinkList p = l->next;while(p){print(p->data);p = p->next;}return SUCCESS;}int GetElem(LinkList l, int k, ElemType *e){int length = 0;LinkList p = l->next;while(p){length++;if(k == length){break;}p = p->next;}if(k>length){return FAILURE;}*e = p->data;return SUCCESS;}int ListLength(LinkList l){int length = 0;LinkList p = l->next;while(p){p = p->next;length ++;}return length;}int ListEmpty(LinkList l){return (l->next == NULL)?TRUE:FALSE;}int ListDelete(LinkList l, int i,ElemType *e){LinkList p = l;int j = 1;LinkList tmp;while(p!=NULL&&j<i){p = p->next;j++;}if(p == NULL || j>i){return FAILURE;}tmp = p->next;p->next = tmp->next;free(tmp);return SUCCESS;}int ListClean(LinkList l){LinkList p = l;LinkList tmp;while(p->next){tmp = p->next;p->next = tmp->next;free(tmp);}return SUCCESS;}int ListDestroy(LinkList *l){free(*l);*l=NULL;return SUCCESS;}int ReverseList(LinkList l){if(l == NULL)return 0;LinkList p = l->next;l->next = NULL;while(p != NULL){LinkList q = p;p = p->next;q->next = l->next;l->next = q;}return 1;}



原创粉丝点击