对顺序表进行初始化,创建,插入,删除和查找操作
#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;
顺序表在插入和删除要移动大量元素,要消耗时间,但是查找十分快。 顺序表比较难扩大空间,而链表可以动态分配空间。