线性表的插入和删除
参考blog : http://blog.sina.com.cn/s/blog_5c5bc9070100y8c9.html
一.算法的基本概念
计算机解题的过程实际上是在实施某种算法,这种算法称为计算机算法。
1.算法的基本特征:可行性,确定性,有穷性,拥有足够的情报。
2.算法的基本要素:算法中对数据的运算和操作、算法的控制结构。
3.算法设计的基本方法:列举法、归纳法、递推、递归、减半递推技术、回溯法。
4.算法设计的要求:正确性、可读性、健壮性、效率与低存储量需求
二.数据结构的定义
1.数据的逻辑结构:反映数据元素之间的关系的数据元素集合的表示。数据的逻辑结构包括集合、线形结构、树形结构和图形结构四种。
2.数据的存储结构:数据的逻辑结构在计算机存储空间种的存放形式称为数据的存储结构。常用的存储结构有顺序、链接、索引等存储结构。
在数据结构中,没有前件的结点称为根结点;没有后件的结点成为终端结点。插入和删除是对数据结构的两种基本运算。还有查找、分类、合并、分解、复制和修改等。
三.线性结构和非线性结构
根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为两大类型:线性结构和非线性结构。
线性结构:非空数据结构满足:有且只有一个根结点;每个结点最多有一个前件,最多只有一个后件。非线性结构:如果一个数据结构不是线性结构,称之为非线性结构。
常见的线性结构:线性表、栈、队列
四.线性表的顺序存储结构
线性表的顺序表指的是用一组地址连续的存储单元依次存储线性表的数据元素。
线性表的顺序存储结构具备如下两个基本特征:
1.线性表中的所有元素所占的存储空间是连续的;
2.线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。
即线性表逻辑上相邻、物理也相邻,则已知第一个元素首地址和每个元素所占字节数,则可求出任一个元素首地址。
假设线性表的每个元素需占用K个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储位置。则线性表中第i+1个数据元素的存储位置LOC(ai+1)和第i个数据元素的存储位置LOC(ai)之间满足下列关系:
LOC(ai+1)=LOC(ai)+K
LOC(ai)=LOC(a1)+(i-1)*K ①
其中,LOC(a1)是线性表的第一个数据元素a1的存储位置,通常称做线性表的起始位置或基地址。
因为在顺序存储结构中,每个数据元素地址可以通过公式①计算得到,所以线性表的顺序存储结构是随机存取的存储结构。
在线性表的顺序存储结构下,可以对线性表做以下运算:
插入、删除、查找、排序、分解、合并、复制、逆转
源码实现:
1 /*--------------------------------
2 线性表的插入和删除
3 ----------------------------------*/
4
5 #include <stdio.h>
6 #include <string>
7 #include <stdlib.h>
8 #include <math.h>
9 #include <iostream>
10
11 using namespace std;
12
13 #define LIST_INIT_SIZE 100 //线性表初始分配发热空间
14 #define LISTINCRMENT 10 //线性表存储空间的分配增量
15 #define ElemType int //指针类型
16
17 typedef struct{
18 ElemType *elem; //存储空间基址
19 int length; //当前长度
20 int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
21 }SqList;
22
23 int initList_Sq(SqList &L); //构造一个空的线性表
24 int listInsert_Sq(SqList &L, int i, ElemType e); //插入元素
25 int listDelete_Sq(SqList &L, int i, ElemType &e); //将第i个元素删除,并用e返回
26
27 //构造一个空的线性表
28 int initList_Sq(SqList &L)//将结构体变量的引用做函数参数
29 {
30 L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
31 if (!L.elem) //存储分配失败
32 {
33 exit(-1);
34 }
35 L.length = 0; //空表长度0
36 L.listsize = LIST_INIT_SIZE; //初始存储容量
37 return true;
38 }
39
40 //在第i个元素之前插入一个元素,i的合法值 1<= i <=L.length+1
41 int ListInsert_Sq(SqList &L,int i,ElemType e)
42 {
43 ElemType *newbase, *q, *p;
44
45 if (i<1 || i>L.length + 1) //i不合法
46 return false;
47 if (L.length >= L.listsize) //当存储空间已满,增加分配
48 {
49 newbase = (ElemType*)realloc(L.elem, LIST_INIT_SIZE * sizeof(ElemType));
50 if (!newbase) //存储分配失败
51 {
52 exit(-1);
53 }
54 L.elem = newbase; //新地址
55 L.listsize += LISTINCRMENT; //增加存储容量,因为只插入了一个,所以LISTINCRMENT就够了
56
57 }
58 q = &(L.elem[i-1]); //q为插入位置
59 for (p = &(L.elem[L.length - 1]); p >= q; --p) //&(L.elem[L.length - 1]最后一个元素的地址
60 {
61 *(p + 1) = *p; //右移1位
62 }
63 *q = e; //在q位置插入e
64 ++L.length; //表长加1
65
66
67 return 0;
68 }
69
70
71 //在顺序表L中删除第i个元素,并用e返回 其值
72 int ListDelete_Sq(SqList &L, int i, ElemType &e)
73 {
74 ElemType *p, *q;
75 if ((i<1) || (i>L.length))
76 return false;
77 p = &(L.elem[i-1]); //删除元素位置
78 e = *p;
79 q = L.elem + L.length - 1; //元素长度
80 for (++p; p <= q; ++p)
81 *(p - 1) = *p; //左移
82 return true;
83 }
84
85 int main()
86 {
87 int i;
88 SqList L;
89 //puts("Please input 5 num: ");
90 initList_Sq(L);
91 ///if (initList_Sq(L))
92 //{
93 //创建新表,输入5个元素
94 for (i = 0; i < 5; i++)
95 {
96 listInsert_Sq(L, i, i);
97 //scanf("shuru :%d", &L.elem[i]); //cin >> L.elem[i];
98 //++L.length;
99 }
100 /*
101 for (i = 0; i < 5; i++)
102 {
103 scanf("%d", &L.elem[i]); //cin >> L.elem[i];
104 }
105 puts(" ");
106 */
107 //}
108 //else
109 //{
110 //puts("ERROR");
111 //exit(-1);
112 //}
113
114 for (i = 0; i<L.length; ++i)
115 {
116 printf("%d ", L.elem[i]);
117 }
118 printf("\n");
119
120 //插入元素,要插入的位置和元素值
121 puts("Please Input Your Insert num and possition:");
122 int pos, num;
123 scanf("%d", &num, &pos);//cin >> num >> pos;
124 printf("\n");
125 if (ListInsert_Sq(L, pos, num))
126 {
127 printf("Insert After:\n");
128 for (i = 0; i < L.length; ++i)
129 printf("%d ", L.elem[i]); //显示插入后的值
130 printf("\n");
131 }
132 else
133 {
134 puts("Insert ERROR");
135 exit(-1);
136 }
137
138 //删除元素,要删除元素的位置
139 puts("Please Input You want to Delete possition:");
140 scanf("%d", &pos); //cin >> pos;
141 if (ListDelete_Sq(L, pos, num))
142 {
143 printf("Delete After:\n");
144 for (i = 0; i < L.length;i++)
145 printf("%d ", L.elem[i]);
146 puts("");
147 }
148 else
149 {
150 puts("Delete ERROR");
151 exit(-1);
152 }
153
154 return 0;
155 }
程序还是有点问题。。。
还没调试好。。。。。。。。发现blog 上的很多东西是不严谨的