数据结构(C语言版).docx
《数据结构(C语言版).docx》由会员分享,可在线阅读,更多相关《数据结构(C语言版).docx(73页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C语言经典(C语言必看文档)数据结构C语言实现系列1一一线性表#include #include typedef int elemType;/*以下是关于线性表顺序存储操作的16种算法 */* struct List elemType *list;int size; int maxSize;);void againMalloc(struct List *L) (/*空间扩展为原来的2倍,并由p指针所指向,原内容被自动拷贝到p所指向的存储空间*/ elemType *p = realloc (L-listr 2 * L-maxSize * sizeof(elemType);if (!p) /*分
2、配失败则退出运行*/printf (存储空间分配失败!); exit(1);1L-list = p; /*使list指向新线性表空间*/L-maxSize = 2 * L-maxSize; /*把线性表空间大小修改为新的长度*/ )/* 1.初始化线性表L,即进行动态存储空间分配并置L为一个空表*/ void initList(struct List *LZ int ms) (/*检查ms是否有效,若无效的则退出运行*/ if(ms maxSize = ms; /设置线性表空间大小为ms */ L-size = 0; L-list = malloc(ms * sizeof(elemType);
3、 if(!L-list)printf (空间分配失败!”);exit (1);return; /* 2 .清除线性表L中的所有元素,释放存储空间,使之成为一个空表*/ void clearList(struct List *L) (if(L-list != NULL)free (L-list);L-list = 0;L-size = L-maxSize = 0; | return;/* 3 .返回线性表L当前的长度,若L为空则返回0 */ int sizeList(struct List *L) (return L-size; /* 4 .判定线性表L是否为空,若为空则返回1,否则返回0 */
4、 int emptyList(struct List *L) (if(L-size =0) return 1;)else return 0; ) )/* 5 .返回线性表L中第pos个元素的值,若pos超出范围,则停止程序运行*/ elemType getElem(struct List *L, int pos) (if (pos L-size) /若 pos 越界则退出运行 */printf (元素序号越界!);exit(1); return L-list pos - 1 ;/*返回线性表中序号为pos值的元素值*/* 6.顺序扫描(即遍历)输出线性表L中的每个元素*/ void trave
5、rseList(struct List *L)int i;for(i = 0; i size; i+) printf (*%d ”, L -list i); printf(M M); return;/* 7 .从线性表L中查找值与x相等的元素,若查找成功则返回其位置,否则返回-1 */ int findList(struct List L, elemType x) ( int i;for(i = 0; i size; i+)if (L-listi = x) return i;) return -1;)/* 8 .把线性表L中第pos个元素的值修改为x的值,若修改成功返回1,否则返回0 */ i
6、nt updatePosList(struct List *LZ int pos, elemType x) (if (pos L-size) /* 若 pos 越界则修改失败 */return 0;L-listpos - 1 = x; return 1; /* 9 .向线性表L的表头插入元素x */ void inserFirstList(struct List *L, elemType x) ( int i;if(L-size = L-maxSize) againMalloc(L); for(i = L-size - 1; i = 0; i-)L-listi + 1 = L -listi;
7、L-list0 = x; L-size +; return;/* 10 .向线性表L的表尾插入元素x */ void insertLastList(struct List *L, elemType x) ( if (L-size = L -maxSize) /*重新分配更大的存储空间*/againMalloc(L);L-list L-size = x; /* 把 x 插入到表尾 */L-size+; /*线性表的长度增加1 */ return; )/ 11 .向线性表L中第pos个元素位置插入元素x,若插入成功返回1,否则返回0 */ int insertPosList(struct List
8、 *LZ int pos, elemType x) ( int i;if (pos L-size + 1) /* 若 pos 越界则插入失败 */return 0;) if (L-size = L-maxSize) /*重新分配更大的存储空间*/againMalloc(L);) for (i = L-size - 1; i = pos - 1; i) L-listi + 1 = L-listi;L-listpos - 1 = x; L-size+; return 1; ) /* 12 .向有序线性表L中插入元素x,使得插入后仍然有序*/ void insertOrderList(struct
9、List *LZ elemType x) ( int iz j;/*若数组空间用完则重新分配更大的存储空间*/ if(L-size = L-maxSize) againMalloc(L);/*顺序查找出X的插入位置*/ for(i = 0; i size; i+) if (x listi) break;) /*从表尾到下标i元素依次后移一个位置,把i的位置空出来*/ for (j = L-size - 1; j = i; j )L-listj+1 = L-listj;/*把x值赋给下标为i的元素*/L-listi = x;/*线性表长度增加1 */L-size+;return; /* 13 .
10、从线性表L中删除表头元素并返回它,若删除失败则停止程序运行*/ elemType deleteFirstList(struct List *L) (elemType temp;int i;if(L -size = 0)printf (线性表为空,不能进行删除操作!);exit(1); temp = L-list0; for(i = 1; i size; i+)L-listi-l = L-listi;L-size-;return temp; )/* 14 .从线性表L中删除表尾元素并返回它,若删除失败则停止程序运行*/ elemType deleteLastList(struct List *L
11、) (if(L -size = 0)printf (”线性表为空,不能进行删除操作! exit(1);L-size-;return L -list L-size;/*返回原来表尾元素的值*/* 15.从线性表L中删除第pos个元素并返回它,若删除失败则停止程序运行*/ elemType deletePosList(struct List *LZ int pos) (elemType temp;int i;if (pos L-size) /* pos 越界则删除失败 */printf (pos值越界,不能进行删除操作! n);exit(1);temp = L-listpos-1;for(i =
12、pos; i size; i+) L-listi-1 = L-listi;L-size; return temp;/* 16 .从线性表L中删除值为x的第一个元素,若成功返回1,失败返回0 */ int deleteValueList(struct List *LZ elemType x) (int 1, j;/从线性表中顺序查找出值为x的第一个元素*/for(i = 0; i size; i+)if (L-listi = x) break;) )/*若查找失败,表明不存在值为x的元素,返回0 */if(i = L-size) return 0;/*删除值为x的元素i */for(j = i
13、+ 1; j size; j+) L-listj-1 = L-listj;L-size;return 1; void main() (int a10 = 2, 4, 6, 8, 10, 12, 14, 16, 18, 20);int i;struct List L;initList(&L, 5);for(i = 0; i 10; i+) insertLastList(&Lr ai);insertPosList(&LZ 11r 48);insertPosList(&LZ 1, 64);printf(n%d ”, getElem(&L, 1);traverseList(&L);printf(n%d
14、 ”, findList(&LZ 10);updatePosList(&LZ 3, 20);printf(n%d ”, getElem(&Lf 3);traverseList(&L);deleteFirstList(&L);deleteFirstList(&L);deleteLastList(&L);deletePosList(&LZ 7);deleteLastList(&L);deletePosList(&LZ 5);printf(H%d ”, sizeList(&L);printf(H%d , emptyList(&L); traverseList(&L);clearList(&L);re
15、turn 0;#include #include #define NN 12#define MM 20typedef int elemType ;/Hr*/*以下是关于线性表链接存储(单链表)操作的16种算法*/struct sNode/*定义单链表结点类型*/elemType data;struct sNode *next;; / 1 .初始化线性表,即置单链表的表头指针为空*/ void initList(struct sNode* *hl) (*hl = NULL;return; /* 2.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表*/ void clearL
16、ist(struct sNode* *hl) (/* cp和np分别作为指向两个相邻结点的指针*/struct sNode *cpz *np;cp = *hl;/*遍历单链表,依次释放每个结点*/while(cp != NULL)np = cp-next; /*保存下个结点的指针*/ free(cp);cp = np; *hl = NULL;/*置单链表的表头指针为空*/return;/* 3.返回单链表的长度*/int sizeList(struct sNode *hl) (int count = 0;/*用于统计结点的个数*/while(hl != NULL) count+;hl = hl
17、-next; return count; )/* 4 .检查单链表是否为空,若为空则返回1,否则返回0 */ int emptyList(struct sNode *hl) (if(hl = NULL) return 1;else return 0;) )/* 5.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行*/ elemType getElem(struct sNode *hlf int pos) (int i = 0;/*统计已遍历的结点个数*/if (pos next;if (hl != NULL) return hl-data;elseprintf (pos值非
18、法,退出运行!);exit(1);)/* 6.遍历一个单链表/ void traverseList(struct sNode *hl) (while (hl != NULL) printf(n%5dH, hl-data); hl = hl-next;)printf(H n); return;)/* 7 .从单链表中查找具有给定值x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL */ elemType* findList(struct sNode *hl, elemType x) (while(hl != NULL) if (hl-data = x) return &
19、hl-data;else hl = hl-next;) return NULL;)/* 8 .把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0 */ int updatePosList(struct sNode hl, int pos, elemType x) (int i = 0;struct sNode *p = hl;while (p != NULL) /* 查找第 pos 个结点 */i+; if(pos = i)break;else p = p-next;)if(pos = i) p-data = x; return 1;elsereturn 0;/* 9.向单
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版
限制150内