设为首页 加入收藏

TOP

顺序表的基本操作(一)
2019-01-05 14:09:02 】 浏览:256
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)格式化输入输出

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目