Sequential table | LSABLOG

首页 » 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