首页 » Program » C/C++ » 正文

Sequential table

对顺序表进行初始化,创建,插入,删除和查找操作

#include <stdio.h>
 3
 4 #define list_init_size 100
 5 #define listincrement 10
 6
 7 typedef struct
 8 {
 9     int *elem;
10     int length;
11     int listsize;
12 } sqlist;
13
14 //初始化顺序表
15 int init(sqlist *L)
16 {
17     L->elem = (int *)malloc(list_init_size *sizeof(int));     //分配空间
18     if (!L->elem)
19         {
20             return 0;
21         }
22     L->length = 0;     //初始化顺序表元素个数为0
23     L->listsize = list_init_size;     //最大长度为100
24     return 1;
25 }
26
27 //创建顺序表
28 void createlist(sqlist *L,int len)
29 {
30     if (len>=list_init_size)        //如果元素个数大于等于顺序表长度,设等于为了方便后续插入操作
31         {
32             L->elem=(int *)realloc(L->elem,len *sizeof(int));     //新增空间
33             L->listsize = len;              //修改最大长度为len
34         }
35
36     printf("请输入顺序表元素\n");
37     for (int i=1; i<=len; i++)      //注意:是从1开始创建!
38         {
39             scanf("%d",&L->elem[i]);
40         }
41
42     L->length = len;               //元素个数赋值为len
43     printf("创建的顺序表为:\n");
44     for (i=1; i<=len; i++)
45         {
46             printf("%d ",L->elem[i]);
47         }
48     printf("\n此顺序表共%d个元素\n",L->length);
49 }
50
51 //插入
52 int ins(sqlist *L,int i,int x)
53 {
54     int j;
55     if (L->length==L->listsize)
56         {
57             printf("顺序表已满,无法插入\n");
58             return 0;
59         }
60
61     else
62         {
63             if (i==L->length+1) L->elem[i] = x;  //如果插入元素位置是表尾,直接赋值
64             else
65                 {
66                     for (j=L->length; j>=i; j--)    //i和i后的元素都后移一位腾出空位给x
67                         L->elem[j+1] = L->elem[j];
68                     L->elem[i] = x;
69                 }
70             L->length++;           //记得顺序表长度加1
71             return 1;
72         }
73 }
74
75 //删除
76 int dele(sqlist *L,int i)
77 {
78     int j;
79     for (j=i; j<L->length; j++) //i后的元素都前移1位达到删除i的效果
80         L->elem[j] = L->elem[j+1];
81     L->length--;           //记得顺序表长度减1
82     return 1;
83 }
84
85 //查找(位置查找元素)
86 int find(sqlist *L,int x)
87 {
88     int *p;
89     p=L->elem+x;   //数组首地址加要找的元素位置即该元素地址
90     return *p;
91 }
92
93 //输出
94 void print(sqlist *L)
95 {
96     int i;
97     for (i=1; i<=L->length; i++)
98         printf("%d ",L->elem[i]);
99 }
100
101 int main()
102 {
103     sqlist L;
104     int sqlen;
105     int location,element;
106     int location2;
107     int location3;
108     if (!init(&L))     //取L的地址传给初始化函数
109         {
110             printf("初始化顺序表失败\n");
111             return 0;
112         }
113     //初始化顺序表完毕----------------------------------------------------
114
115     printf("输入顺序表元素个数\n");
116     scanf("%d",&sqlen);
117     createlist(&L,sqlen);     //传L的地址以及元素个数给创建函数
118     //创建顺序表完毕------------------------------------------------------
119
120     printf("请输入插入元素位置和值:\n");
121     scanf("%d%d",&location,&element);
122     while (location>L.length+1||location<1)        //插入的位置不能为顺序表第一个元素之前和最后一个元素之后
123         {
124             printf("插入位置不合法,重新输入\n");
125             scanf("%d",&location);
126         }
127     if (!ins(&L,location,element))      //传L的地址,插入元素位置以及数值给插入函数
128         {
129             printf("顺序表插入失败\n");
130             return 0;
131         }
132     print(&L);
133     printf("\n插入后的顺序表共%d个元素\n",L.length);
134     //插入操作完毕---------------------------------------------------------
135
136     printf("请输入删除的元素位置:\n");
137     scanf("%d",&location2);
138     while (location2>L.length||location2<1)    //删除的位置不能为顺序表最后一个元素之后和第一个元素之前
139         {
140             printf("删除位置不合法,重新输入:\n");
141             scanf("%d",&location2);
142         }
143     if (!dele(&L,location2))          //传L的地址和删除元素的位置给删除函数
144         {
145             printf("删除发生错误\n");
146             return 0;
147         }
148     print(&L);
149     printf("删除后的顺序表共%d个元素\n",L.length);
150     //删除操作完毕-----------------------------------------------------------
151
152     printf("请输入查找的元素位置:\n");
153     scanf("%d",&location3);
154     while (location3>L.length||location3<1)        //查找的元素不能是顺序表最后一个元素之后和第一个元素之前
155         {
156             printf("输入位置不合法,程序输入:\n");
157             scanf("%d",&location3);
158         }
159     printf("第%d个元素是:%d\n",location3,find(&L,location3));
160     //查找操作完毕------------------------------------------------------------
161
162     return 0;
顺序表在插入和删除要移动大量元素,要消耗时间,但是查找十分快。
顺序表比较难扩大空间,而链表可以动态分配空间。

Comment

please input captcha *