線性表——順序存儲(C語言版,附帶源代碼)

 順序表存儲結構容易實現隨機存取線性表的第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的博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章