标签:nbsp lis ted compare get define ace efi str
/*************************************************************** Author :h-j-w Created Time :2017-11-16 File Name :链表的基本存储操作 **************************************************************/ #include<iostream> #include<math.h> #include<stdio.h> #include<malloc.h> #include<algorithm> #define OK 1 #define ERROR 0 #define OVERFLOW 1 using namespace std; /**************************************************************/ typedef int Status; typedef int ElemType; typedef struct LNode { ElemType data; int length; struct LNode *next; }*Node , *LinkList; /**************************************************************/ //建表 Status Init(LinkList &L) { Node p = (Node)malloc(sizeof(LNode)); if(p) { L = p; p->next = NULL; L->length = 0; return OK; } else return ERROR; } /**************************************************************/ //在第i个位置插入元素e,需要找到其前一个结点 Status Insert(LinkList &L , int i, ElemType e) { Node p,s; p = L; int j = 0; while(p && j < i - 1) //找到第i-1个结点 { p = p -> next; ++j; } if(!p || j > i - 1) return ERROR; s = (Node)malloc(sizeof(LNode)); s->data = e; s->next = p->next; p->next = s; L->length++; } /**************************************************************/ //删除第i个元素,并用e返回其值,若不存在返回ERROR Status Delete(LinkList &L, int i, ElemType &e) { if(i < 1 || i > L->length)//i值不合法 return ERROR; int j = 0; Node p,q; p = L; while(p->next && j < i - 1) { p = p->next; j++; } if(!(p->next) || j > i - 1) return ERROR; q = p->next; p -> next = q -> next; e = q->data; free(q); L->length--; return OK; } /**************************************************************/ //查询链表中第一个与e满足compare()关系的元素的位置,不存在则返回0 bool compare(ElemType e1 , ElemType e2) { if(e1 > e2) return true; else return false; } int Locate(LinkList L ,ElemType e , bool (*compare)(ElemType,ElemType)) { Node p; p = L->next; int j = 1; while( j <= L->length && (!(*compare)(p->data,e))) { p = p -> next; j++; } if(j <= L->length) return j; else return 0; } /**************************************************************/ //查询第i个位置的元素值,用e返回,否则返回ERROR int Getelem(LinkList L , int i) { ElemType e; if(i < 1 || i > L->length) return ERROR; Node p; p = L; int j = 0; while( p && j < i) { p = p->next; j++; } if(!p || j > i) return ERROR; e = p->data; return e; } /**************************************************************/ //判断链表是否为空 bool Empty(LinkList L) { if(L->next == NULL) return true; else return false; } /**************************************************************/ //清空链表 Status Clear(LinkList &L) { Node p; while(L->next) { p = L->next; L->next = p->next; free(p); } L->next = NULL; L->length = 0; return OK; } /**************************************************************/ int main() { LinkList L; ElemType e; Init(L); int n,i; i = 0; while(~scanf("%d",&n)) { if(n == 0) break; i++; Insert(L,i,n); } printf("链表的长度为:%d\n",L->length); /**************************************************************/ //遍历 printf("链表的元素为:"); Node tmp; tmp = L->next; while(tmp) { printf("%d",tmp->data); if(tmp->next != NULL) printf(" "); else printf("\n"); tmp = tmp->next; } /**************************************************************/ //删除第x个位置上的元素 int x; printf("请输入想要删除的元素的位置:"); scanf("%d",&x); Delete(L,x,e); printf("删除的元素为第%d个,值为:%d\n",x,e); printf("链表中剩余的元素为:"); tmp = L->next; while(tmp) { printf("%d",tmp->data); if(tmp->next != NULL) printf(" "); else printf("\n"); tmp = tmp->next; } /**************************************************************/ //查询链表中第一个与e满足compare()关系的元素的位置,不存在则返回0 printf("请输入要查询的元素:"); scanf("%d",&x); int vis = Locate(L,x,compare); printf("第一个大于%d的元素的位置为:%d,值为:%d\n",x,vis,Getelem(L,vis)); /**************************************************************/ //清空链表 printf("执行清空链表操作!\n"); Clear(L); if(Empty(L)) printf("kong\n"); else printf("No kong\n"); printf("链表的长度为:%d\n",L->length); /**************************************************************/ return 0; } /*数据(0为结束输入的标志) 1 2 3 4 5 6 7 8 9 10 0 */
标签:nbsp lis ted compare get define ace efi str
原文地址:http://www.cnblogs.com/hhkobeww/p/7845746.html