順序表存儲結構容易實現隨機存取線性表的第i個數據元素的操作。
但是在實現插入,刪除的操作時需要移動大量的數據元素,所以它適用於數據相對穩定的線性表。
/* c2-1.h 線性表的動態分配順序存儲結構 */
#define LIST_INIT_SIZE 10 /* 線性表存儲空間的初始分配量 */
#define LIST_INCREMENT 2 /* 線性表存儲空間的分配增量 */
typedef struct
{
ElemType *elem; /* 存儲空間基址 */
int length; /* 當前長度 */
int listsize; /* 當前分配的存儲容量(以sizeof(ElemType)爲單位) */
}SqList;;
Status ListInsert(SqList *L,int i,ElemType e) /* 算法2.4 */
{ /* 初始條件:順序線性表L已存在,1≤i≤ListLength(L)+1 */
/* 操作結果:在L中第i個位置之前插入新的數據元素e,L的長度加1 */
ElemType *newbase,*q,*p;
if(i<1||i>(*L).length+1) /* i值不合法 */
return ERROR;
if((*L).length>=(*L).listsize) /* 當前存儲空間已滿,增加分配 */
{
newbase=(ElemType *)realloc((*L).elem,((*L).listsize+LIST_INCREMENT)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW); /* 存儲分配失敗 */
(*L).elem=newbase; /* 新基址 */
(*L).listsize+=LIST_INCREMENT; /* 增加存儲容量 */
}
q=(*L).elem+i-1; /* q爲插入位置 */
for(p=(*L).elem+(*L).length-1;p>=q;--p) /* 插入位置及之後的元素右移 */
*(p+1)=*p;
*q=e; /* 插入e */
++(*L).length; /* 表長增1 */
return OK;
}
<span style="font-size:18px;"><span style="font-size:18px;">#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
struct sqlist
{
int *elem; //存儲空間基址
int length;//當前長度
int listsize;//當前分配的存儲容量
};
void sqlist_init(struct sqlist *L,int len) //建立一個空的的順序表
{
L->elem =(int *)malloc(sizeof(int) * len);//malloc函數的作用是分配字節空間(int佔的字節數*存儲容量),因爲 //要賦值給L->elem(int型指針),所以要通過(int *)來強制轉換
L->length =0; //空表長度爲0
L->listsize =len; //存儲容量爲len
}
void sqlist_input(struct sqlist *L) //爲順序表輸入數據
{
int i,n;
printf(" 請輸入要輸入元素的個數:");
scanf("%d",&n);
printf(" 請輸入要輸入的元素\n");
for(i=0;i<n;i++)
{
scanf("%d",&(L->elem [i]));//例如:int e[10];這裏的&(L->elem[i]) 和&(e[i])一個意思
L->length ++;
}
}
void sqlist_output(struct sqlist *L) //輸出順序表中的數據
{
int i;
FILE *fp=fopen("sqlist.dat","w+");//新建一個文件“sqlist.dat”,“w+”爲讀寫建立一個新的字符文件
for(i=0;i<L->length ;i++)
{
printf("%d\n",L->elem [i]);
fprintf(fp,"%d\n",L->elem [i]);//將數據寫入文件中
}
}
void output(struct sqlist *L) //將數據寫入文件
{
int i;
FILE *fp=fopen("sqlist.dat","w+");
for(i=0;i<L->length ;i++)
{
fprintf(fp,"%d\n",L->elem [i]);
}
}
void sqlist_insert(struct sqlist *L, int i, int e) //在順序表插入數據
{
int *j,*p;
if(i<1||i>L->length +1)
{
printf("插入位置非法\n");
exit(0);
}
j=&(L->elem [i-1]); //j爲插入位置地址
for(p=&(L->elem [L->length -1]);p>=j;--p) //從後向前(從右向左)循環
*(p+1)=*p; //插入位置及之後的元素右移
*j=e; //插入e
++L->length ; //在這裏寫成 L->length ++;也行
}
void sqlist_delete(struct sqlist *L, int i) //在順序表中刪除數據
{
int *j,*q,*p;
if(L->length ==0)
{
printf("現行表爲空,退出運行\n");
exit(0);
}
if(i<1||i>L->length )
{
printf("刪除位置非法\n");
exit(0);
}
j=&(L->elem [i-1]); //j爲刪除位置地址
q=L->elem +L->length -1;//或者寫成q=&(L->elem[L->length-1]);</span><span style="font-size:18px;">
for(++j;j<=q;++j) //這裏必須寫成++j
*(j-1)=*j; //刪除位置及之後的元素左移
--L->length ;
}
void sqlist_statistical(struct sqlist *L) //統計順序表中的奇偶數目
{
int *p;
int count_odd=0;
int count_even=0;
for(p=L->elem ;p<=L->elem +L->length -1;p++)
{
if(*p%2==0)
count_even++;
if(*p%2==1)
count_odd++;
}
printf(" 順序表中的偶數個數爲%d\n",count_even);
printf(" 順序表中的奇數個數爲%d\n",count_odd);
}
void sqlist_look(struct sqlist *L,int i) //查詢順序表中的單獨數據
{
printf("%d\n",L->elem [i-1]);
}
void main_sqlist(struct sqlist *L)
{
int i,e;
int choose=0;
printf(" 以下是對順序表的操作\n");
printf("-------------------------------------------------------\n");
printf(" 1. 在順序表插入數據\n");
printf(" 2. 在順序表中刪除數據\n");
printf(" 3. 輸出順序表中的數據\n");
printf(" 4. 查詢順表表中單獨的數據\n");
printf(" 5. 統計順序表中的奇偶數目\n");
printf("-------------------------------------------------------\n");
printf(" 請選擇你的操作:");
scanf("%d",&choose);
switch(choose)
{
case 1: {
printf("請輸入要插入的位置:");
scanf("%d",&i);
printf("請輸入要插入的元素:");
scanf("%d",&e);
sqlist_insert(L,i,e); //在順序表插入數據
}break;
case 2: {
printf("請輸入要刪除元素的位置:");
scanf("%d",&i);
sqlist_delete(L,i); //在順序表中刪除數據
}break;
case 3: sqlist_output(L); //輸出順序表中的數據
break;
case 4: {
printf("請輸入要查詢元素的位置:");
scanf("%d",&i);
sqlist_look(L,i); //查詢順表表中單獨的數據
}break;
case 5: sqlist_statistical(L); //統計順序表中的奇偶數目
break;
}
printf(" 是否繼續執行操作(1.是 2.否):");
scanf("%d",&choose);
if(choose==1)
main_sqlist(L);
else
{
output(L); //將數據寫入文件
exit(-1);
}
}
void main()
{
struct sqlist L;
FILE *fp=fopen("sqlist.dat","w+");
sqlist_init(&L,20); //建立一個空的的順序表
sqlist_input(&L); //爲順序表輸入數據
main_sqlist(&L);
}</span></span>
注:圖片來自sjmp的博客