单链表
/** * 单链表 **/ #include <stdlib.h> #include <iostream.h> #define OK 1 #define ERROR 0 //结点类型 typedef struct node{ int item; struct node *next; }NODE; //链表类型 typedef struct{ NODE *head; }LINK_LIST; //初始化单链表 int init(LINK_LIST *L) { L->head=(NODE*)malloc(sizeof(NODE)); //为头结点分配存储单元 if (L->head) { L->head->next=NULL; return OK; } else return ERROR; } //销毁链表L void destory(LINK_LIST *L) { NODE *p; while (L->head){ //依次删除链表中的所有结点 p=L->head; L->head=L->head->next; free(p); } } //清空单链表 void clear(LINK_LIST *L) { NODE *p; while (L->head->next){ p=L->head->next; //p指向链表中头结点后面的第一个结点 L->head->next=p->next; //删除p结点 free(p); //释放p结点占据的存储空间 } } //链表长度 int length(LINK_LIST L) { NODE *p = L.head; int len; for(p=L.head,len=0; p->next!=NULL; p=p->next,len++); return(len); } //判断是否为空 int isEmpty(LINK_LIST L) { if(L.head->next==NULL) return 1; else return 0; } //通过e返回链表L中第i个数据元素的内容 void getElem(LINK_LIST L,int i,int *e) { NODE *p; int j; if (i<1||i>length(L)) exit(0); //检测i值的合理性 for (p=L.head,j=0; j!=i; p=p->next,j++); //找到第i个结点 *e=p->item; //将第i个结点的内容赋给e指针所指向的存储单元中 } //在链表L中检索值为e的数据元素 NODE *locateELem(LINK_LIST L,int e) { NODE *p; for(p=L.head->next;p&&p->item!=e;p=p->next); //寻找满足条件的结点 return(p); } //返回链表L中结点e的直接前驱结点 NODE *PriorElem(LINK_LIST L,NODE *e) { NODE *p; if (L.head->next==e) return NULL; //检测第一个结点 for (p=L.head;p->next&&p->next!=e;p=p->next); if (p->next==e) return p; else return NULL; } //返回链表L中结点e的直接后继结点 NODE *NextElem(LINK_LIST L,NODE *e) { NODE *p; for(p=L.head->next;p&&p!=e;p=p->next); if (p) p=p->next; return p; } //在链表L中第i个数据元素之前插入数据元素e int insertList(LINK_LIST *L,int i,int e) { NODE *p,*s; int j; if (i<1||i>length(*L)+1) return ERROR; s=(NODE*)malloc(sizeof(NODE)); if (s==NULL) return ERROR; s->item=e; for (p=L->head,j=0;p&&j<i-1;p=p->next,j++); //寻找第i-1个结点 s->next=p->next; p->next=s; //将s结点插入 return OK; } //将链表L中第i个数据元素删除,并将其内容保存在e中。 int deleteList(LINK_LIST *L,int i,int *e) { NODE *p,*s; int j; if (i<1||i>length(*L)) return ERROR; //检查i值的合理性 for(p=L->head,j=0;j<i-1;p=p->next,j++); //寻找第i-1个结点 s=p->next; //用s指向将要删除的结点 *e=s->item; p->next=s->next; //删除s指针所指向的结点 free(s); return OK; } //插入链表 void insert(LINK_LIST *L) { cout<<"请依次递增输入这5个数据:"<<endl; NODE *head = L->head; for(int i=0;i<5;i++) { NODE* node = (NODE*)malloc(sizeof(NODE)); cin>>node->item; node->next = NULL; head->next = node; head = node; } } //输出单链表 void print(LINK_LIST L) { NODE* head = L.head->next; while(head != NULL) { cout<<head->item<<" "; head = head->next; } cout<<endl; }