【数据结构 Python & C++】顺序表

用C++ 和 Python实现顺序表的简单操作

C++代码

  1 // Date:2019.7.31
  2 // Author:Yushow Jue
  3 
  4 #include<iostream>
  5 using namespace std;
  6 
  7 #define MAXSIZE 3
  8 #define Node ElemType
  9 #define ERROR 0
 10 typedef int DataType;
 11 
 12 //创建一个节点类
 13 class Node
 14 {
 15 public:
 16     DataType data;
 17 };
 18 
 19 //创建一个顺序表类
 20 class SqList
 21 {
 22 public:
 23     SqList();     //初始化顺序表
 24     ~SqList();    //销毁顺序表
 25     void CreateSqList(int n);       //定义创建一个顺序表
 26     void TraverseSqList();          //遍历顺序表
 27     ElemType GetElemByIndex(int i); //根据下标查找顺序表中的元素
 28     bool isEmpty();                 //判断顺序表是否为空
 29     bool isFull();                  //判断顺序表是否满
 30     int GetLength();                //获取顺序表的长度
 31     int GetElemByElem(DataType data);    //查看顺序表中是否含有查找的值
 32     void InsertSqList(int n, DataType data);     //向顺序表中插入新数据
 33     void InsertSqListAtHead(DataType data);      //在头部插入新数据
 34     void InsertSqListAtEnd(DataType data);       //向顺序表的最后插入数据
 35     void DeleteElem(int i);              //删除指定位置的值
 36     void DeleteElemAtElem(DataType data);//按值删除元素
 37     void DeleteAll();                    //删除所有元素
 38     void DeleteAtHead();                 //在头部删除元素
 39 private:
 40     Node* elem;                  //顺序表的基地址
 41     int length;                   //顺序表的长度
 42 };
 43 
 44 //初始化顺序表
 45 SqList::SqList()
 46 {
 47     elem = new ElemType[MAXSIZE];   //开辟空间
 48     if (!elem) {                    //当溢出时报异常
 49         exit(OVERFLOW);
 50     }
 51     length = 0;                     //定义顺序表的长度
 52 }
 53 
 54 //销毁顺序表
 55 SqList::~SqList()
 56 {
 57     delete[] elem;   //删除基地址的指针
 58 }
 59 
 60 //创建顺序表
 61 void SqList::CreateSqList(int n)
 62 {
 63     if (n < 0) {                                //当输入的数值有误时报异常
 64         cout << "输入的节点个数有误!" << endl;
 65         exit(EXIT_FAILURE);
 66     }
 67     else {
 68         int i;
 69         for (i = 0; i < n; i++) {                //循环向数组中插入数据
 70             cout << "请输入第" << i + 1 << "个节点元素: ";
 71             cin >> elem[i].data;
 72         }
 73         length = n;                             //更改顺序表的长度
 74     }
 75 }
 76 
 77 //遍历顺序表
 78 void SqList::TraverseSqList()
 79 {
 80     for (int i = 0; i < length; i++) {           //循环打印顺序表的每个节点数据
 81         cout << "" << i + 1 << "个元素的值是" << elem[i].data << endl;
 82     }
 83 }
 84 
 85 //通过下标获取元素
 86 ElemType SqList::GetElemByIndex(int i)
 87 {
 88     if (i < 1 || i > length) {       //下标输入有误时报异常
 89         cout << "查询的下标不存在" << endl;
 90     }
 91     else {
 92         return elem[i - 1];          //返回下标指定的节点
 93     }
 94 }
 95 
 96 //判断顺序表是否为空
 97 bool SqList::isEmpty()
 98 {
 99     if (length == 0)    //如果顺序表的长度为0,则表为空
100         return true;
101     return false;       //长度不为0,表不为空
102 }
103 
104 //判断顺序表是否满
105 bool SqList::isFull()
106 {
107     if (length == MAXSIZE)   //当长度为定义的最大长度,则顺序表满
108         return true;
109     return false;            //否则不满
110 }
111 
112 //获取顺序表的长度
113 int SqList::GetLength()
114 {
115     return length;     //返回顺序表的长度
116 }
117 
118 //判断是否存在寻找的值,如果存在将返回下标
119 int SqList::GetElemByElem(DataType data)
120 {
121     int i;
122     for (i = 0; i < length; i++) {    //从头遍历顺序表
123         if (elem && elem[i].data == data) {  //若找到与之匹配的数据,则返回当前节点的下标
124             return i + 1;
125         }
126         if (i == length - 1) {       //否则返回-1
127             return -1;
128         }
129 
130     }
131 }
132 
133 //插入一个数据
134 void SqList::InsertSqList(int i, DataType data)
135 {
136     if (i<1 || i > length + 1) {      //下标输入有误时报异常
137         cout << "输入的下标不合法" << endl;
138     }
139     else if (length > MAXSIZE) {   //当顺序表满时无法插入新的数据
140         cout << "已经达到最大长度" << endl;
141     }
142     else
143     {
144         for (int j = length - 1; j >= i - 1; j--) {   //遍历到要插入的位置
145             elem[j + 1] = elem[j];     //从j位置后的全体数据向后移一位
146         }
147         elem[i - 1].data = data;       //插入数据
148         length++;                      //更改顺序表长度
149     }
150 }
151 
152 //在头部插入一个新数据
153 void SqList::InsertSqListAtHead(DataType data)
154 {
155 
156     for (int i = length - 1; i >= 0; i--)  //将全体元素向后移一位
157     {
158         elem[i + 1] = elem[i];
159     }
160     elem[0].data = data;         //在第一个位置插入元素
161     length++;                    //更改长度
162 }
163 
164 //在顺序表的最后插入数据
165 void SqList::InsertSqListAtEnd(DataType data)
166 {
167     if (length > MAXSIZE) {   //当顺序表满时无法插入新的数据
168         cout << "已经达到最大长度" << endl;
169     }
170     else
171     {
172         elem[length].data = data;      //插入数据
173         length++;                      //更改顺序表长度
174     }
175 }
176 
177 //根据下标删除一个节点
178 void SqList::DeleteElem(int i)
179 {
180     int j;
181     if (i<1 || i>length)           //输入的位置不合法报异常
182         cout << "输入的下标不合法" << endl;
183     else
184     {
185         for (j = i; j <= length - 1; j++) { //循环到要删除节点的位置
186             elem[j - 1] = elem[j];         //该位置后的元素全体向前移一个位置
187         }
188         length--;                          //更改顺序表长度
189     }
190 }
191 
192 //按值删除元素
193 void SqList::DeleteElemAtElem(DataType data)
194 {
195     int i = 0;
196     while (elem[i].data == data && i < length)   //按值查到要删除数据的位置
197     {
198         i++;
199     }
200     for (int index = i; index <= length - 1; index++) //将该位置后的节点全体向前移一位
201     {
202         elem[index - 1] = elem[index];
203     }
204     length--;                              //更改顺序表长度
205 }
206 
207 //删除所有元素
208 void SqList::DeleteAll()
209 {
210     for (int i = length; i > 0; i--)    //从最后一个元素开始删除,长度减一
211     {
212         elem[i] = elem[i - 1];        //元素向前移位
213         length--;                     //长度减一
214     }
215 }
216 
217 //在头部删除元素
218 void SqList::DeleteAtHead()
219 {
220     for (int i = 1; i <= length - 1; i++) {
221         elem[i - 1] = elem[i];
222     }
223     length--;
224 }
225 
226 //测试函数
227 int main()
228 {
229     SqList l;
230     int i;
231     cout << "1.创建一个顺序表   2.遍历顺序表   3.通过下标获取元素\n4.查找要查询的元素的下标   5.通过下标插入元素   6.通过下标删除一个元素\n7.获取顺序表的长度   8.删除所有元素   9.判断顺序表是否为空\n10.判断顺序表是否满   11.根据数据删除节点   12.在头部插入数据\n13.在头部删除数据   14.在顺序表最后插入数据   0.退出" << endl;
232     do
233     {
234         cout << "请选择一个操作: ";
235         cin >> i;
236         switch (i)
237         {
238         case 1:
239             int n;
240             cout << "请输入顺序表的元素个数: ";
241             cin >> n;
242             l.CreateSqList(n);
243             break;
244         case 2:
245             l.TraverseSqList();
246             break;
247         case 3:
248             int i;
249             cout << "请输入将要获取元素的下标: ";
250             cin >> i;
251             ElemType getElemByIndex = l.GetElemByIndex(i);
252             cout << getElemByIndex.data << endl;
253             break;
254         case 4:
255             DataType data;
256             cout << "请输入将要查找元素的值: ";
257             cin >> data;
258             cout << "该元素的下标为:" << l.GetElemByElem(data) << endl;
259             break;
260         case 5:
261             int index;
262             DataType insertData;
263             cout << "请输入要插入的数据的位置: ";
264             cin >> index;
265             cout << "请输入要插入的数据: ";
266             cin >> insertData;
267             l.InsertSqList(index, insertData);
268             break;
269         case 6:
270             int deleteIndex;
271             cout << "请输入要删除的数据的下标: ";
272             cin >> deleteIndex;
273             l.DeleteElem(deleteIndex);
274             break;
275         case 7:
276             cout << l.GetLength() << endl;
277             break;
278         case 8:
279             l.DeleteAll();
280             break;
281         case 9:
282             if (l.isEmpty() == 1) {
283                 cout << "顺序表为空" << endl;
284             }
285             else
286             {
287                 cout << "顺序表不为空" << endl;
288             }
289             break;
290         case 10:
291             if (l.isFull() == 1) {
292                 cout << "顺序表满" << endl;
293             }
294             else
295             {
296                 cout << "顺序表不满" << endl;
297             }
298             break;
299         case 11:
300             DataType data1;
301             cout << "请输入要删除的数据: ";
302             cin >> data1;
303             l.DeleteElemAtElem(data1);
304             break;
305         case 12:
306             DataType data2;
307             cout << "请输入要在头部插入的数据: ";
308             cin >> data2;
309             l.InsertSqListAtHead(data2);
310             break;
311         case 13:
312             l.DeleteAtHead();
313             break;
314         case 14:
315             DataType data3;
316             cout << "请输入要在末尾插入的数据: ";
317             cin >> data3;
318             l.InsertSqListAtEnd(data3);
319             break;
320         default:
321             break;
322         }
323     } while (i != 0);
324     system("pause");
325     return 0;
326 }
View Code

Python代码

class SqList(object):

    def __init__(self, size=6):
        self.max = size
        self.length = 0
        self.list = []

    # 创建顺序表
    def create_list(self, ):
        self.length = int(input("请输入顺序表长度"))
        while self.length > self.max:
            print("超出最大范围6,重新输入。")
            self.length = int(input("请输入顺序表长度"))
        i = 0
        while i < self.length:
            temp = input("请输入第%s个元素" % i)
            try:
                temp = float(temp)
                self.list.append(temp)
                i += 1
            except ValueError:
                print("wrong value !")

    # 遍历
    def print_list(self):
        print(self.list)

    # 判空
    def is_empty(self):
        if self.length == 0:
            print("顺序表为空")

    # 判满
    def is_full(self):
        if self.length == self.max:
            return True

    # 根据下标索引
    def get_elem_by_index(self, index):
        if index >= self.length:
            print("下标超出范围")
        else:
            print("第%s个元素为:%s" % (index, self.list[index]))

    # 按值查找
    def get_elem_by_elem(self, value):
        for i in range(self.length):
            if value == self.list[i]:
                return i
        return -1

    # 插入
    def insert(self, index, value):
        if not isinstance(index, int):
            raise TypeError
        elif index < 0 or index > self.length:
            raise IndexError
        else:
            self.list.append(0)
            for i in range(self.length, index, -1):
                self.list[i] = self.list[i-1]
            self.list[index] = value
            self.length += 1

    # 按值删除
    def delete_elem(self, index):
        for i in range(index, self.length):
            self.list[index] = self.list[index+1]
        self.list.pop()
        self.length -= 1

    # 清空顺序表
    def clear(self):
        self.list.clear()


if __name__ == '__main__':
    sq_list = SqList()
    sq_list.create_list()
    sq_list.print_list()
    if sq_list.is_full():
        print("顺序表满了")
    print("操作码:")
    print("1:插入  2:按值查找  3:按值删除  4:清空  0:退出")
    op = 1
    while op != 0:
        op = int(input("请输入操作码:"))
        if op == 1:
            if sq_list.is_full():
                print("顺序表已满,无法插入")
            else:
                input_index = int(input("插入位置"))
                input_value = float(input("插入元素"))
                sq_list.insert(input_index, input_value)
                sq_list.print_list()

        elif op == 2:
            input_value = float(input("元素值"))
            num = sq_list.get_elem_by_elem(input_value)
            if num != -1:
                print("存在元素%s,下标为%s" % (input_value, num))
            else:
                print("不存在")

        elif op == 3:
            input_value = float(input("元素值"))
            num = sq_list.get_elem_by_elem(input_value)
            sq_list.delete_elem(num)
            sq_list.print_list()

        elif op == 4:
            sq_list.clear()
            print("清空顺序表")
            sq_list.print_list()

        else:
            break
View Code

 

posted @ 2019-08-02 16:43  Yushow  阅读(198)  评论(0编辑  收藏  举报