logo资料库

实现循环单链表的各种基本运算的算法.doc

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
上机实验 2.2.2 姓名 学号 2017036513 院系 信息工程学院 班级 2017 级物联网 课程 数据结构 日期 2018-04-15 循环单链表 实现循环单链表的各种基本运算的算法 //定义单链表结点类型 实验名称 目的 内容: #include #include typedef char ElemType; typedef struct LNode { ElemType data; struct LNode *next; } LinkList; void InitList(LinkList *&L) { L=(LinkList *)malloc(sizeof(LinkList)); L->next=L; //创建头结点 } void DestroyList(LinkList *&L) { LinkList *p=L,*q=p->next; while (q!=L) { free(p); p=q; q=p->next; } free(p); } int ListEmpty(LinkList *L) { return(L->next==L); } int ListLength(LinkList *L) { LinkList *p=L;int i=0; while (p->next!=L) { i++; p=p->next;
} return(i); } void DispList(LinkList *L) { LinkList *p=L->next; while (p!=L) { printf("%c",p->data); p=p->next; } printf("\n"); } int GetElem(LinkList *L,int i,ElemType &e) { int j=0; LinkList *p; if (L->next!=L) { if (i==1) { //单链表不为空表时 e=L->next->data; return 1; //i 不为 1 时 } else { p=L->next; while (jnext; } if (p==L) return 0; else { } e=p->data; return 1; } } else return 0; } //单链表为空表时
int LocateElem(LinkList *L,ElemType e) { LinkList *p=L->next; int n=1; while (p!=L && p->data!=e) { p=p->next; n++; } if (p==L) else return(0); return(n); } int ListInsert(LinkList *&L,int i,ElemType e) { int j=0; LinkList *p=L,*s; if (p->next==L || i==1) { //原单链表为空表或 i==1 时 //创建新结点*s s=(LinkList *)malloc(sizeof(LinkList)); s->data=e; s->next=p->next; p->next=s; return 1; //将*s 插入到*p 之后 } else { p=L->next; while (jnext; } if (p==L) return 0; else { } //未找到第 i-1 个结点 //找到第 i-1 个结点*p s=(LinkList *)malloc(sizeof(LinkList)); s->data=e; s->next=p->next; p->next=s; return 1; //创建新结点*s //将*s 插入到*p 之后
} } int ListDelete(LinkList *&L,int i,ElemType &e) { int j=0; LinkList *p=L,*q; if (p->next!=L) { if (i==1) { q=L->next; e=q->data; L->next=q->next; free(q); return 1; } else { //原单链表不为空表时 //i==1 时 //删除第 1 个结点 //i 不为 1 时 p=L->next; while (jnext; } if (p==L) return 0; else { q=p->next; e=q->data; p->next=q->next; free(q); return 1; //未找到第 i-1 个结点 //找到第 i-1 个结点*p //q 指向要删除的结点 //从单链表中删除*q 结点 //释放*q 结点 } } } else return 0; //以下均为外部函数 } extern void InitList(LinkList *&L); extern void DestroyList(LinkList *&L); extern int ListEmpty(LinkList *L); extern int ListLength(LinkList *L); extern void DispList(LinkList *L); extern int GetElem(LinkList *L,int i,ElemType &e);
extern int LocateElem(LinkList *L,ElemType e); extern int ListInsert(LinkList *&L,int i,ElemType e); extern int ListDelete(LinkList *&L,int i,ElemType &e); void main() { LinkList *h; ElemType e; printf("(1)初始化循环单链表 h\n"); InitList(h); printf("(2)依次采用尾插法插入 a,b,c,d,e 元素\n"); ListInsert(h,1,'a'); ListInsert(h,2,'b'); ListInsert(h,3,'c'); ListInsert(h,4,'d'); ListInsert(h,5,'e'); printf("(3)输出循环单链表 h:"); DispList(h); printf("(4)循环单链表 h 长度=%d\n",ListLength(h)); printf("(5)循环单链表 h 为%s\n",(ListEmpty(h)?"空":"非空")); GetElem(h,3,e); printf("(6)循环单链表 h 的第 3 个元素=%c\n",e); printf("(7)元素 a 的位置=%d\n",LocateElem(h,'a')); printf("(8)在第 4 个元素位置上插入 f 元素\n"); ListInsert(h,4,'f'); printf("(9)输出循环单链表 h:"); DispList(h); printf("(10)删除 h 的第 3 个元素\n"); ListDelete(h,3,e); printf("(11)输出循环单链表 h:"); DispList(h); printf("(12)释放循环单链表 h\n"); DestroyList(h); }
分享到:
收藏