设为首页 加入收藏

TOP

顺序表的基本操作(一)
2019-01-05 14:09:02 】 浏览:156
Tags:顺序 基本操作

  

  1 //顺序线性表
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #define LIST_INIT_SIZE 100 //线性表储存空间的初始分配量
  5 #define LISTINCREMENT 10  //线性表储存空间的分配增量
  6 #define OK 1
  7 #define ERROR 0
  8 typedef double ElemType;
  9 typedef struct {
 10     ElemType *elem;  //储存空间基地址
 11     int length;        //当前长度
 12     int listsize;   //当前分配的储存容量(以sizeof(ElemType))为单位
 13 }SqList;
 14 //顺序表的初始化
 
		    

15
void InitList(SqList *L) { 16 L->elem = (ElemType*)malloc(LIST_INIT_SIZE); 17 if (!L->elem) //储存分配失败 18 exit(-1); 19 L->length = 0; //空表长度为0 20 L->listsize = LIST_INIT_SIZE; //初始储存容量 21 } 22 //判断表是否为空 23 int EmptyList(SqList *L) 24 { 25 if (L->length == 0) 26 { 27 return OK; 28 } 29 return ERROR; 30 } 31 //顺序表的插入 32 int ListInsert(SqList *L,int i,ElemType e) { 33 //在顺序表L中的第i个位置之前插入新的元素e,L的长度加1 34 //i=1时头插 i=L->length+1 时尾插 35 ElemType *newbase, *q, *p; 36 if (i<1 || i>L->length + 1) //输入的i值不合法 37 return ERROR; 38 if (L->length >= L->listsize) //当前储存空间已满,增加分配 39 { 40 newbase = (ElemType*)realloc(L->elem, (L->listsize + 41 LISTINCREMENT) * sizeof(ElemType)); 42 if (!newbase) exit(-1); 43 L->elem = newbase; //新基地址 44 L->listsize += LISTINCREMENT; //增加储存容量 45 } 46 q = L->elem + i - 1; //获得插入位置的地址 47 for (p = L->elem + L->length - 1; p >= q; --p) 48 //q之后的元素右移一步,腾出空间 49 *(p + 1) = *p; 50 *q = e; //插入e 51 ++L->length; //表长加1 52 return OK; 53 54 55 } 56 //头插 57 int TopInsert(SqList *L, ElemType e) { 58 ElemType *newbase, *p; 59 int i; 60 if (L->length >= L->listsize) //当前储存空间已满,增加分配 61 { 62 newbase = (ElemType*)realloc(L->elem, (L->listsize + 63 LISTINCREMENT) * sizeof(ElemType)); 64 if (!newbase) exit(-1); 65 L->elem = newbase; //新基地址 66 L->listsize += LISTINCREMENT; //增加储存容量 67 } 68 p = L->elem + L->length - 1; 69 for (i = L->length; i > 0; --i) 70 {//表中所有元素右移一步,腾出空间 71 *(p + 1) = *p; 72 p--; 73 } 74 *L->elem = e; //插入e 75 ++L->length; //表长加1 76 return OK; 77 } 78 //尾插 79 int BackInsert(SqList *L,ElemType e) { 80 ElemType *newbase, *p; 81 if (L->length >= L->listsize) //当前储存空间已满,增加分配 82 { 83 newbase = (ElemType*)realloc(L->elem, (L->listsize + 84 LISTINCREMENT) * sizeof(ElemType)); 85 if (!newbase) exit(-1); 86 L->elem = newbase; //新基地址 87 L->listsize += LISTINCREMENT; //增加储存容量 88 } 89 p = L->elem + L->length; //p指向最后一个元素的后一个地址 90 *p = e; //插入e 91 L->length++; //表长加1 92 return OK; 93 94 } 95 //顺序表的删除 96 int ListDelete(SqList *L, int i, ElemType *e) { 97 //删除L的第i个元素,并用e返回其值,L的表长减1 98 //i=1 头删 i=L->length+1 尾删 99 ElemType *p, *q; 100 if (i<1 || i>L->length + 1) //输入的i值不合法 101 return ERROR; 102 p = L->elem + i - 1; //p为被删除元素的位置 103 *e = *p; //被删除元素的值赋给e 104 q = L->elem + L->length - 1; //表尾元素的位置 105 for (++p; p <= q; ++p)//删除元素后的元素左移 106 *(p - 1) = *p; 107 L->length--; //表长减1 108 return OK; 109 110 } 111 //头删 112 int TopDelete(SqList *L, ElemType *e) { 113 ElemType *p, *q; 114 if (EmptyList(L) == OK) return ERROR; 115 p = L->elem ; //p为被删除元素的位置 116 *e = *p; //被删除元素的值赋给e 117 q = L->elem + L->length - 1; //表尾元素的位置 118 for (++p; p <= q; ++p)//删除元素后的元素左移 119 *(p - 1) = *p; 120 L->length--; //表长减1 121 return OK; 122 } 123 //尾删 124 int BackDelete(SqList *L, ElemType *e) { 125 126 if (EmptyList(L) == OK) return ERROR; 127 *e = *L->elem + L->length - 1; 128 L->length--; //表长减1 129 return OK; 130 } 131 132 //打印表中元素 133 void PrintList(
编程开发网
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇约瑟夫环 下一篇C语言入门教程-(5)格式化输入输出

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(217) }