极客 - 博文28 - 动态数组实现链表各种操作

来源:互联网 发布:python 重试装饰器 编辑:程序博客网 时间:2024/05/17 04:48
*程序名称: 动态数组实现链表各种操作
*作者: 田鑫  
*完成日期: 2016 - 10 - 25 
*版本号: v1.0 
*平台: vs2015
*问题描述: 动态数组实现链表各种操作
#include <stdio.h>#include <stdlib.h>#include <malloc.h>typedef int elemType;typedef struct queue{elemType *data;int size;int maxSize;}SquList;typedef SquList * PSquList;PSquList creatList(void);//创建链表void againMalloc(PSquList L);//当前链表满, 增加空间int sizeList(PSquList L);//返回当前的链表位置int emptyList(PSquList L);//判断是否为空链表elemType getElem(PSquList L, int pos);//查找特定位置上的元素void traverseList(PSquList L);//遍历链表int search(PSquList L, elemType x);//链表中查找特定的元素值的位置int updataPosList(PSquList L, int pos, elemType x); //修改特定位置上的元素值void insertFisrtList(PSquList L, elemType x);//链表头部插入新节点void insertLastList(PSquList L, elemType x);//链表尾部插入新节点void insertPosList(PSquList L, int pos, elemType x);//链表特定位置插入新节点void insertOrderList(PSquList L, elemType x);//有序链表中插入新节点后仍有序elemType deleteFirstList(PSquList L);//删除链表第一个元素elemType deleteLastList(PSquList L);//删除链表最后元素elemType deletePosList(PSquList L, int pos);//删除链表特定位置元素int deleteValueList(PSquList L, elemType x);//删除链表特定值元素int main(void){PSquList List;int value;int deleteValue;List = creatList();printf("Input the value:");scanf_s("%d", &value);/**********测试插入函数********/while (value != -1){insertFisrtList(List, value);scanf_s("%d", &value);;}traverseList(List);/**********测试删除函数********/deleteValue = deleteFirstList(List);printf("Delete element is %d\n", deleteValue);traverseList(List);system("pause");return 0;}/**功能:创建链表*参数:void*返回值:返回链表的首地址*/PSquList creatList(void){int term;PSquList L;do{printf("How many term are you want to creat: ");scanf_s("%d", &term);}while(term < 1);L = (PSquList)malloc(sizeof(SquList));if (!L){printf("Memery distry error!\n");exit(1);}L->data = (elemType*)malloc(sizeof(elemType) * term);if (!L->data){printf("Memery distry error!\n");exit(1);}L->size = 0;L->maxSize = term;return L;}/**功能:扩增链表*参数:原链表地址*返回值:void*/void againMalloc(PSquList L){int term;elemType *p;do{printf("How many term are you want to increase: ");scanf_s("%d", &term);} while (term < 1);p = (elemType*)realloc(L->data,   sizeof(elemType) * (L->maxSize + term));if (!p){printf("Memery distry error!\n");exit(1);}L->data = p;L->maxSize = (L->maxSize + term);}/**功能:返回当前链表的的位置*参数:链表地址*返回值:当前链表的的位置*/int sizeList(PSquList L){return L->size;}/**功能:判断链表是否为空*参数:链表地址*返回值:真则返回1,否则返回0*/int emptyList(PSquList L){return L->data == 0;}/**功能:得到指定位置的元素值*参数:链表地址和需要查找的位置*返回值:返回查找到的元素*/elemType getElem(PSquList L, int pos){if (pos < 1 || pos > L->size){printf("Input error!\n");exit(1);}return L->data[pos - 1];}/**功能:遍历链表*参数:链表地址*返回值:void*/void traverseList(PSquList L){int i;for (i = 0; i < L->size; i++){printf("%4d", L->data[i]);}printf("\n");}/**功能:返回与查找值相同元素的位置*参数:链表地址*返回值:匹配的元素位置*/int search(PSquList L, elemType x){int i;for (i = 0; i < L->size; i++){if (x == L->data[i]){return i;}}return -1;}/**功能:修改指定位置的值*参数:链表地址*返回值:修改成功返回1,否则返回0*/int updataPosList(PSquList L, int pos, elemType x){if (pos < 1 || pos > L->size){printf("Input error!\n");return 0;}L->data[pos - 1] = x;return 1;}/**功能:链表头部插入新节点*参数:链表地址和需要插入的值*返回值:void*/void insertFisrtList(PSquList L, elemType x){int i;if (L->size == L->maxSize){againMalloc(L);}for (i = L->size - 1; i >= 0; i--){L->data[i + 1] = L->data[i];}L->data[0] = x;L->size++;}/**功能:链表尾部插入新节点*参数:链表地址和需要插入的值*返回值:void*/void insertLastList(PSquList L, elemType x){if (L->size == L->maxSize){againMalloc(L);}L->data[L->size] = x;L->size++;}/**功能:链表指定位置插入新节点*参数:链表地址和需要插入的值和插入的位置*返回值:void*/void insertPosList(PSquList L, int pos, elemType x){int i;if (pos < 1 || pos > L->size + 1){printf("Input error!\n");exit(1);}if (L->size == L->maxSize){againMalloc(L);}for (i = L->size - 1; i >= pos - 1; i--){L->data[i + 1] = L->data[i];}L->data[pos - 1] = x;L->size++;}/**功能:有序链表插入新节点后仍然有序*参数:链表地址和需要插入的值*返回值:void*/void insertOrderList(PSquList L, elemType x){int i, j;if (L->size == L->maxSize){againMalloc(L);}for (i = 0; i < L->size; i++){if (x < L->data[i]);{break;}}for (j = L->size - 1; j >= i; j--){L->data[j + 1] = L->data[j];}L->data[i] = x;L->size++;}/**功能:删除链表第一个元素*参数:链表地址*返回值:返回删除元素的值*/elemType deleteFirstList(PSquList L){elemType temp;int i;if (emptyList(L)){printf("List is empty!\n");exit(1);}temp = L->data[0];for (i = 0; i < L->size - 1; i++){L->data[i] = L->data[i + 1];}L->size--;return temp;}/**功能:删除链表最后一个元素*参数:链表地址*返回值:返回删除元素的值*/elemType deleteLastList(PSquList L){if (emptyList(L)){printf("List is empty!\n");exit(1);}L->size--;return L->data[L->size];}/**功能:删除链表指定位置的元素*参数:链表地址*返回值:返回删除元素的值*/elemType deletePosList(PSquList L, int pos){elemType temp;int i;if (pos < 1 || pos > L->size){printf("Input error!\n");exit(1);}temp = L->data[pos - 1];for (i = pos - 1; i < (L->size - 1); i++){L->data[i] = L->data[i + 1];}L->size--;return temp;}/**功能:删除链表中与输入的值相同的元素*参数:链表地址*返回值:删除成功返回1, 否则返回货0*/int deleteValueList(PSquList L, elemType x){int i, j;for (i = 0; i < L->size; i++){if (x == L->data[i]){break;}}if(i == L->size){printf("Not find!\n");return 0;}for (j = i; j < (L->size - 1); i++){L->data[j] = L->data[j + 1];}L->size--;return 1;}

运行结果:


1 0
原创粉丝点击