赞
踩
实验题2:实现单链表各种基本运算的方法
目的:编写一个程序linklist.cpp,实现单链表的各种基本运算和整体建表算法(假设单链表的元素类型ElemType为char),并在此设计的基础上设计程序exp2-2.cpp完成如下功能:
输出顺序表的基本运算如下:
(1)初始化单链表h。
(2)依次采用尾插法插入a, b, c, d, e元素。
(3)输出单链表h。
(4)输出单链表h长度。
(4)单链表h为。
(5)判断单链表h是否为空。
(6)输出单链表h的第3个元素。
(7)元素a的位置 。
(8)在第4个元素位置插入f元素。
(9)输出单链表h。
(10)删除单链表h的第三个元素。
(11)输出单链表h。
(12)释放单链表h。
#include <stdio.h> #include <malloc.h> typedef char ElemType; typedef struct LNode { ElemType data; struct LNode * next; } LinkNode; //头插法建立单链表 void CreateListF(LinkNode *&L, ElemType a[], int n) { LinkNode * s; L = (LinkNode *)malloc(sizeof(LinkNode)); L -> next = NULL; for(int i = 0; i < n;n++) { s = (LinkNode *)malloc(sizeof(LinkNode)); s -> data = a[i]; L -> next = s; } } //尾插法建立建立单链表 void CreateListR(LinkNode *&L, ElemType a[], int n) { LinkNode * s, * r; L = (LinkNode *)malloc(sizeof(LinkNode)); L -> next = NULL; r = L; for(int i = 0; i < n;n++) { s = (LinkNode *)malloc(sizeof(LinkNode)); s -> data = a[i]; L -> next = s; r = s; } r -> next = NULL; } //初始化线性表 void InitList(LinkNode *&L) { L = (LinkNode *)malloc(sizeof(LinkNode)); L -> next = NULL; } //销毁线性表 void DestroList(LinkNode *&L) { LinkNode * pre = L, *p = pre -> next; while(p != NULL) { free(pre); pre = p; p = pre -> next; } free(pre); } //判断线性表是否为空表 bool ListEmpty(LinkNode *L) { return(L -> next == NULL); } //求线性表的长度 int ListLength(LinkNode * L) { int i = 0; LinkNode *p = L; while(p -> next != NULL) { i++; p = p -> next; } return(i); } //输入线性表 void DispList(LinkNode * L) { LinkNode *p = L -> next; while(p != NULL) { printf("%c ", p -> data); p = p -> next; } printf("\n"); } //求线性表中第i个元素值 bool GetElem(LinkNode * L, int i, ElemType &e) { int j = 0; LinkNode *p = L; if(i <= 0) { return false; } while(j < i && p != NULL) { j++; p = p -> next; } if(p == NULL) { return false; } else { e = p -> data; return true; } } //查找第一个值域为e的元素符号 int LocateElem(LinkNode * L, ElemType e) { int i = 1; LinkNode * p = L ->next, *s; while(p != NULL && p -> data != e) { p = p ->next; i++; } if(p == NULL) { return(0); }else { return i; } } //插入第i个元素 bool ListInsert(LinkNode *&L, int i, ElemType e) { int j = 0; LinkNode *p = L, *s; if(i <= 0) { return false; } while(j < i -1 && p != NULL) { j++; p = p ->next; } if(p == NULL) { return false; } else { s = (LinkNode *)malloc(sizeof(LinkNode)); s -> data = e; s -> next = p -> next; p -> next = s; return true; } } //删除第i个元素 bool ListDelete(LinkNode *&L, int i, ElemType &e) { int j = 0; LinkNode *p = L, *q; if(i <= 0) { return false; } while(j < i-1 && p != NULL) { j++; p = p ->next; } if(p == NULL) { return false; } else { q = p ->next; if(q == NULL) { return false; } e = q ->data; p ->next = q ->next; free(q); return true; } } int main() { LinkNode * h; ElemType e; printf("单链表的基本运算如下:\n"); 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的第三个元素\n" ); ListDelete(h, 3, e); printf(" (11)输出单链表h: "); DispList(h); printf(" (12)释放单链表h\n"); DestroList(h); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。