版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#include <stdio.h>#include <stdlib.h>typedef int elemType;/*/* 以下是关于线性表顺序存储操作的16种算法
2、 */*/struct List elemType *list; int size; int maxSize;void againMalloc(struct List *L) /* 空间扩展为
3、原来的2倍,并由p指针所指向,原内容被自动拷贝到p所指向的存储空间 */ elemType *p = realloc(L->list, 2 * L->maxSize * sizeof(elemType); if(!p) /* 分配失败则退出运行 */
4、60;printf("存储空间分配失败! "); exit(1); L->list = p; /* 使list指向新线性表空间 */ L->maxSize = 2 * L->maxSize;
5、 /* 把线性表空间大小修改为新的长度 */* 1.初始化线性表L,即进行动态存储空间分配并置L为一个空表 */void initList(struct List *L, int ms) /* 检查ms是否有效,若无效的则退出运行 */ if(ms <= 0)
6、60; printf("MaxSize非法! "); exit(1); /* */ L->maxSize = ms; /* 设置线性表空间大小为ms */ L->size
7、 = 0; L->list = malloc(ms * sizeof(elemType); if(!L->list) printf("空间分配失败! "); exit(1);
8、60; return;/* 2.清除线性表L中的所有元素,释放存储空间,使之成为一个空表 */void clearList(struct List *L) if(L->list != NULL) free(L->list); L->list
9、160;= 0; L->size = L->maxSize = 0; return;/* 3.返回线性表L当前的长度,若L为空则返回 */int sizeList(struct List *L) return L->size;/*
10、0;4.判断线性表L是否为空,若为空则返回1, 否则返回0 */int emptyList(struct List *L) if(L->size =0) return 1; else return
11、 0; /* 5.返回线性表L中第pos个元素的值,若pos超出范围,则停止程序运行 */elemType getElem(struct List *L, int pos) if(pos < 1 | pos > L->size) /* 若pos越界则退出运行 */
12、0; printf("元素序号越界! "); exit(1); return L->listpos - 1; /* 返回线性表中序号为pos值的元素值 */* 6.顺序扫描(即遍历)输出线性表L中的每个元素
13、160;*/void traverseList(struct List *L) int i; for(i = 0; i < L->size; i+) printf("%d ", L ->listi);
14、; printf(" "); return;/* 7.从线性表L中查找值与x相等的元素,若查找成功则返回其位置,否则返回-1 */int findList(struct List *L, elemType x) int i; for(i = 0; i <
15、160;L->size; i+) if(L->listi = x) return i; return -1;/*
16、 8.把线性表L中第pos个元素的值修改为x的值,若修改成功返回1,否则返回0 */int updatePosList(struct List *L, int pos, elemType x) if(pos < 1 | pos > L->size) /* 若pos越界则修改失败 */
17、 return 0; L->listpos - 1 = x; return 1;/* */void inserFirstList(struct List *L, elemType x) int i;
18、; if(L->size = L->maxSize) againMalloc(L); for(i = L->size - 1; i >= 0; i-) L-&g
19、t;listi + 1 = L ->listi; L->list0 = x; L->size +; return;/* */void insertLastList(struct List *L, elemType x) &
20、#160; if(L->size = L ->maxSize) /* 重新分配更大的存储空间 */ againMalloc(L); L->listL->size = x; /* 把x插入到表尾 *
21、/ L->size+; /* 线性表的长度增加 */ return;/* 11.向线性表L中第pos个元素位置插入元素x,若插入成功返回,否则返回 */int insertPosList(struct List *L, int pos, elemType x) int i;
22、160; if(pos < 1 | pos > L->size + 1) /* 若pos越界则插入失败 */ return 0; if(L->size = L->maxSize)
23、60; /* 重新分配更大的存储空间 */ againMalloc(L); for(i = L->size - 1; i >= pos - 1; i-)
24、;L->listi + 1 = L->listi; L->listpos - 1 = x; L->size+; return 1;/* 12.向有序线性表L中插入元素x,使得插入后仍然有序*/void insertOrderList(struct List *
25、L, elemType x) int i, j; /* 若数组空间用完则重新分配更大的存储空间 */ if(L->size = L->maxSize) againMalloc(L);
26、;/* 顺序查找出x的插入位置 */ for(i = 0; i < L->size; i+) if(x < L->listi) break;
27、60; /* 从表尾到下标i元素依次后移一个位置, 把i的位置空出来 */ for(j = L->size - 1; j >= i; j-) L->listj+1 = L
28、->listj; /* 把x值赋给下标为i的元素 */ L->listi = x; /* 线性表长度增加1 */ L->size+; return;/* 13.从线性表L中删除表头元素并返回它,若删除失败则停止程序运行 */
29、elemType deleteFirstList(struct List *L) elemType temp; int i; if(L ->size = 0) printf("线性表为空,不能进行删除操作! ");
30、 exit(1); temp = L->list0; for(i = 1; i < L->size; i+) L->listi-1 = L->listi;
31、 L->size-; return temp;/* 14.从线性表L中删除表尾元素并返回它,若删除失败则停止程序运行 */elemType deleteLastList(struct List *L) if(L ->size = 0) printf("线性表为空,不能进行删除操作! &quo
32、t;); exit(1); L->size-; return L ->listL->size; /* 返回原来表尾元素的值 */* 15.从线性表L中删除第pos个元素并返回它,若删除失败则停止程序运行&
33、#160;*/elemType deletePosList(struct List *L, int pos) elemType temp; int i; if(pos < 1 | pos > L->size) /*
34、60;pos越界则删除失败 */ printf("pos值越界,不能进行删除操作! "); exit(1); temp = L->listpos-1; for(i = pos; i
35、60;< L->size; i+) L->listi-1 = L->listi; L->size-; return temp;/* 16.从线性表L中删除值为x的第一个元素,若成功返回1,失败返回0 */int deleteValueList(struct List *L,
36、;elemType x) int i, j; /* 从线性表中顺序查找出值为x的第一个元素 */ for(i = 0; i < L->size; i+) if(L->listi = x)
37、; break; /* 若查找失败,表明不存在值为x的元素,返回0 */ if(i = L->size)
38、 return 0; /* 删除值为x的元素L->listi */ for(j = i + 1; j < L->size; j+) L->listj-1 = L->list
39、j; L->size-; return 1;/*/void main() int a10 = 2, 4, 6, 8, 10, 12, 14, 16, 18, 20; int i;
40、; struct List L; initList(&L, 5); for(i = 0; i < 10; i+) insertLastList(&L, ai); insertPosList
41、(&L, 11, 48); insertPosList(&L, 1, 64); printf("%d ", getElem(&L, 1); traverseList(&L); printf("%d ", findList(&a
42、mp;L, 10); updatePosList(&L, 3, 20); printf("%d ", getElem(&L, 3); traverseList(&L); deleteFirstList(&L);
43、0; deleteFirstList(&L); deleteLastList(&L); deleteLastList(&L); deletePosList(&L, 5);
44、 deletePosList(&L, 7); printf("%d ", sizeList(&L); printf("%d ", emptyList(&L); traverseList(&L); clearList(&L);
45、 return 0; #include <stdio.h>#include <stdlib.h>#define NN 12#define MM 20typedef int elemType /*/* 以下是关于线性表链接存储(单链表)操作的16种算法
46、160; */*/struct sNode /* 定义单链表结点类型 */ elemType data; struct sNode *next;/* 1.初始化线性表,即置单链表的表头指针为空 */void initList(struct sNode* *hl)
47、0; *hl = NULL; return;/* 2.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表 */void clearList(struct sNode* *hl) /* cp和np分别作为指向两个相邻结点的指针 */ struct sNode *cp, *np;
48、 cp = *hl; /* 遍历单链表,依次释放每个结点 */ while(cp != NULL) np = cp->next; /* 保存下一个结点的指针 */
49、60;free(cp); cp = np; *hl = NULL; /* 置单链表的表头指针为空 */ return;/* */int sizeList(struct s
50、Node *hl) int count = 0; /* 用于统计结点的个数 */ while(hl != NULL) count+; hl
51、0;= hl->next; return count;/* 4.检查单链表是否为空,若为空则返回,否则返回 */int emptyList(struct sNode *hl) if(hl = NULL) return 1; &
52、#160;else return 0; /* 5.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行 */elemType getElem(struct sNode *hl, int pos) int i = 0;
53、 /* 统计已遍历的结点个数 */ if(pos < 1) printf("pos值非法,退出运行! "); exit(1); while(hl != NULL)&
54、#160; i+; if(i = pos) break; hl
55、;= hl->next; if(hl != NULL) return hl->data; else printf("pos值非法,退出运行! ");
56、160; exit(1); /* */void traverseList(struct sNode *hl) while(hl != NULL) printf("%5d", hl->data);
57、60; hl = hl->next; printf(" "); return;/* 7.从单链表中查找具有给定值x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL */elemType* findList(struct sNode *hl, elemType x)
58、0;while(hl != NULL) if(hl->data = x) return &hl->data; else
59、; hl = hl->next; return NULL;/* 8.把单链表中第pos个结点的值修改为x的值,若修改成功返回,否则返回 */int updatePosList(struct sNode *hl,
60、0;int pos, elemType x) int i = 0; struct sNode *p = hl; while(p != NULL) /* 查找第pos个结点 */
61、160; i+; if(pos = i) break; else p
62、60;= p->next; if(pos = i) p->data = x; return 1; els
63、e return 0; /* */void insertFirstList(struct sNode* *hl, elemType x) struct sNode *newP; newP = malloc(sizeof(struct s
64、Node); if(newP = NULL) printf("内存分配失败,退出运行! "); exit(1); newP->data = x; &
65、#160; /* 把x的值赋给新结点的data域 */ /* 把新结点作为新的表头结点插入 */ newP->next = *hl; *hl = newP; return;/* */void
66、 insertLastList(struct sNode* *hl, elemType x) struct sNode *newP; newP = malloc(sizeof(struct sNode); if(newP = NULL) print
67、f("内在分配失败,退出运行! "); exit(1); /* 把x的值赋给新结点的data域,把空值赋给新结点的next域 */ newP->data = x; newP->next = NULL;
68、160; /* 若原表为空,则作为表头结点插入 */ if(*hl = NULL) *hl = newP; /* 查找到表尾结点并完成插入 */
69、 else struct sNode *p = NULL; while(p->next != NULL) p = p->next; &
70、#160; p->next = newP; return;/* 11.向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回,否则返回 */int insetPosList(struct sNode* *hl, int pos, elemType
71、160;x) int i = 0; struct sNode *newP; struct sNode *cp = *hl, *ap = NULL; /* 对pos值小于等于的情况进行处理 */ if(pos <=&
72、#160;0) printf("pos值非法,返回表示插入失败! "); return 0; /* 查找第pos个结点 */ while(cp != NULL)
73、60; i+; if(pos = i) break; else
74、;ap = cp; cp = cp->next; /* 产生新结点,若分配失败,则停止插入 */ newP = malloc(sizeo
75、f(struct sNode); if(newP = NULL) printf("内存分配失败,无法进行插入操作! "); return 0; /* 把x的值赋给新结点的data域 */
76、60; newP->data = x; /* 把新结点插入到表头 */ if(ap = NULL) newP->next = cp; /* 或改为newP->next
77、= *hl; */ *hl = newP; /* 把新结点插入到ap和cp之间 */ else newP->next = cp;
78、; ap->next = newP; return 1; /* 插入成功返回1 */* 12.向有序单链表中插入元素x结点,使得插入后仍然有序 */void insertOrderList(struct sNode* *hl, elemType x)&
79、#160; /* 把单链表的表头指针赋给cp,把ap置空 */ struct sNode *cp = *hl, *ap = NULL; /* 建立新结点 */ struct sNode *newP; newP = malloc(si
80、zeof(struct sNode); if(newP = NULL) printf("内在分配失败,退出运行! "); exit(1); newP->data = x; &
81、#160; /* 把x的值赋给新结点的data域 */ /* 把新结点插入到表头 */ if(cp = NULL) | (x < cp->data) newP->next = cp;
82、 *hl = newP; return; /* 顺序查找出x结点的插入位置 */ while(cp != NULL) if(x <
83、0;cp->data) break; else ap = cp;
84、 cp = cp->next; /* 把x结点插入到ap和cp之间 */ newP->next = cp; ap->next = newP; return;/*
85、160;13.从单链表中删除表头结点,并把该结点的值返回,若删除失败则停止程序运行 */elemType deleteFirstList(struct sNode* *hl) elemType temp; struct sNode *p = *hl; /* 暂存表头结点指针,以便回收 */ &
86、#160; if(*hl = NULL) printf("单链表为空,无表头可进行删除,退出运行! "); exit(1); *hl = (*hl)->next;
87、0; /* 使表头指针指向第二个结点 */ temp = p->data; /* 暂存原表头元素,以便返回 */ free(p);
88、160; /* 回收被删除的表头结点 */ return temp; /* 返回第一个结点的值 */* 14.从单链表中删除表尾结点并返回它的值,若删除失败则停止程序运行 */elemType deleteLastList(struct sNode* *hl)
89、60; elemType temp; /* 初始化cp和ap指针,使cp指向表头结点,使ap为空 */ struct sNode *cp = *hl; struct sNode *ap = NULL; /* 单链表为空则停止运行 */
90、60; if(cp = NULL) printf("单链表为空,无表头进行删除,退出运行! "); exit(1); /* 从单链表中查找表尾结点,循环结束时cp指向表尾结点,ap指向其前驱结点 */
91、while(cp->next != NULL) ap = cp; cp = cp->next; /* 若单链表中只有一个结点,则需要修改表头指针 */ if(ap =
92、160;NULL) *hl = (*hl)->next; /* 或改为*hl = NULL; */ /* 删除表尾结点 */ else
93、160; ap->next = NULL; /* 暂存表尾元素,以便返回 */ temp = cp->data; free(cp); /* 回收被删除的表尾结点 */
94、160; return temp; /* 返回表尾结点的值 */* 15.从单链表中删除第pos个结点并返回它的值,若删除失败则停止程序运行 */elemType deletePosList(struct sNode* *hl, int pos) int i = 0; el
95、emType temp; /* 初始化cp和ap指针,使cp指向表头结点,使ap为空 */ struct sNode *cp = *hl; struct sNode *ap = NULL; /* 单链表为空或pos值非法则停止运行 */ i
96、f(cp = NULL) | (pos <= 0) printf("单链表为空或pos值不正确,退出运行! "); exit(1); /* 从单链表中查找第pos个结点,找到后由cp指向该结点,由ap指向其前驱结点
97、0;*/ while(cp != NULL) i+; if(i = pos) break;
98、; ap = cp; cp = cp->next; /* 单链表中没有第pos个结点 */ if(cp = NULL)
99、0; printf("pos值不正确,退出运行! "); exit(1); /* 若pos等于1,则需要删除表头结点 */ if(pos = 1) *hl = (*hl)
100、->next; /* 或改为*hl = cp->next; */ /* 否则删除非表头结点,此时cp指向该结点,ap指向前驱结点 */ else ap->next = cp-
101、>next; /* 暂存第pos个结点的值,以便返回 */ temp = cp->data; free(cp); /* 回收被删除的第pos个结点 */ return temp; &
102、#160; /* 返回在temp中暂存的第pos个结点的值 */* 16.从单链表中删除值为x的第一个结点,若删除成功则返回1,否则返回0 */int deleteValueList(struct sNode* *hl, elemType x) /* 初始化cp和ap指针,使cp指向表头结点,使ap为空 */ struct sNode *cp = *hl; struct sNode *ap = NUL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿心理健康与行为指导
- 2026年体育说课稿模版
- 护理安全管理课件获取
- 2026年特发性肾小动脉硬化诊疗试题及答案(肾内科版)
- Glaspimod-生命科学试剂-MCE
- 高效节能压缩机替换项目可行性研究报告
- 初中2025文明礼仪“我遵守”说课稿
- 2026年走进法治天地说课稿
- 初中生网络谣言心理说课稿
- 初中“共传承”2025民俗文化说课稿
- 2026贵州遵义市政务服务管理局下属事业单位招聘编外人员2人考试模拟试题及答案解析
- 2026中国主题公园行业市场调研及消费趋势与投资机会研究报告
- 校园创意设计
- 2026届陕西西安高考物理模拟卷(原卷版)
- 长期照护师职业技能鉴定考试复习题库(附答案)
- 2026年中国钢铁余热发电市场数据研究及竞争策略分析报告
- 太阳能光热发电课件
- 2025-2030中国互联网家装市场发展现状及趋势前景分析研究报告
- (2025年)新GSP质管部长、质量负责人培训试卷及答案
- 2026中复神鹰碳纤维西宁有限公司招聘40人考试参考试题及答案解析
- 关于取消原定采购订单的通知函8篇
评论
0/150
提交评论