数据结构—顺序表基本操作(c语言代码)

顺序表

计算机内部存储一张线性表是用一组连续地址内存单元,这种存储结构即为顺序存储结构,这种结构下的线性表叫顺序表。


顺序表有两种定义方法:

                                    1.静态定义

                                    2.动态生成

顺序表是最简单的一种线性存储结构,优点:构造简单,操作方便,通过顺序表的首地址(或数组名)可直接对表进行随机存取

                                                       缺点:可能浪费存储空间,插入或者删除时候需要对后边一系列的数据进行操作,效率低

下面举两个实例并附上c语言代码+注释来理解

静态顺序表

/********************************************************************************
创建一个静态的顺序表存放整数,大小为10,完成以下的操作
1.输入6个整数,打印出顺序表的内容,并显示表中剩余空间的个数
2.在顺序表的第三个位置处插入元素0,打印出表中的内容,并显示空间中剩余的个数
3.再试图插入表中第11个位置整数0,程序提示超出范围
4.删除表中第6个元素,最后显示空间中剩余的个数
*********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
/**     函数inserElem的作用:顺序表Sqlist第i个位置上插入元素x,并将长度加1 */
/**     向顺序表中插入元素                                                   */
/**     参数Sqlist:表首地址                                                   */
/**     参数*len:表的长度                                                     */
/**     参数i:插入元素的位置                                                 */
/**     参数x:待插入的元素值                                                 */
void insertElem(int Sqlist[] , int *len , int i , int x)
{
    int t;
    if(*len==MaxSize || i<1 || i>*len+1)  //长度为len的顺序表可插入的位置为1-len+1 其余的还有表已满的情况均超出范围
    {
        printf("非法插入\n");
        return;
    }
    for(t = *len-1 ; t>=i-1 ; t--)
        Sqlist[t+1] = Sqlist[t];    //将i-1后的元素顺序后移一个元素的位置
    Sqlist[i-1] = x;                //插入元素
    *len  =  *len+1;                //表长加1
}

/**     函数inserElem的作用:顺序表Sqlist第i个位置上插入元素x,并将长度加1 */
/**     向顺序表中删除元素                                                   */
/**     参数Sqlist:表首地址                                                   */
/**     参数*len:表的长度                                                     */
/**     参数i:插入元素的位置                                                 */
void DelElem(int Sqlist[] , int *len , int i)
{
    int j;
    if(i<1 || i>*len)
    {
        printf("非法删除\n");
        return;
    }
    for(j =i ; j<=*len-1 ; j++)
        Sqlist[j-1] = Sqlist[j];
    *len = *len-1;
}
/**     测试函数   根据题目要求   */
int main()
{
    int Sqlist[MaxSize];
    int len;
    int i;
    for(i = 0 ; i<6 ; i++)
    {
        scanf("%d",&Sqlist[i]);
    }
    len = 6;
    for(i= 0 ; i<len ; i++)
        printf("%d\t",Sqlist[i]);
    printf("\n剩余空间为%d\n" , MaxSize - len);
    insertElem(Sqlist , &len , 3 , 0);          //表中第三个位置插入整数0
    for(i= 0 ; i<len ; i++)
        printf("%d\t",Sqlist[i]);
    printf("\n剩余空间为%d\n" , MaxSize - len);
    insertElem(Sqlist , &len , 11 , 0);         //表中第11个位置插入0
    DelElem(Sqlist  ,   &len , 6);              //删除第六个元素
    for(i= 0 ; i<len ; i++)
        printf("%d\t",Sqlist[i]);
    printf("\n剩余空间为%d\n" , MaxSize - len);
    return 0;
}
动态顺序表


/********************************************
 *动态的创建一个顺序表
 *初始长度10,向顺序表中输入15个整数,并打印
 *再删除顺序表中的第五个元素,打印出结果
 ********************************************/ 
#include<stdio.h>
#include<conio.h>
#define MaxSize 10
#include<bits/stdc++.h>
/* 定义一个结构体Sqlist */ 
typedef struct{
	int *elem;      	//指向顺序表的首地址 
	int length;			//顺序表中表的长度(表中元素的个数) 
	int listsize;		//顺序表存储空间容量 
}Sqlist;	
/* 通过一个函数initSqlist实现动态的生成一个顺序表 初始化一个顺序表 */
/* 参数L:Sqlist类型的指针	因为是指针所以可以在函数中直接对顺序表进行操作 */
void initSqlist(Sqlist *L){
	//调用malloc函数动态分配一段空间,并将空间首地址赋给L的elem成员,L->elem指向顺序表的首单元 
	L ->elem = (int *)malloc(MaxSize*sizeof(int));	 
	if(!L ->elem)	exit(0);
	L -> length = 0;			//置0表示表空  刚生成 
	L -> listsize = MaxSize;	//置MaxSize  表示空间大小 
}//Sqlist类型的变量L就代表了一张顺序表 可以灵活操作  L->elem头地址  L->length长度   L->MaxSize容量 

/******************** 
 *向顺序表中插入元素
 *参数L :Sqlist类型的指针
 *参数i:插入元素的位置
 *参数item:插入的元素
 *********************/
void InsertElem(Sqlist *L, int i, int item){
	//向顺序表L中的第i个位置插入元素item
	int *base, *insert_ptr, *p;
	if(i < 1 || i > L->length+1)	exit(0);	//非法插入 退出 
	if(L->length >= L->listsize)
	{
		//realloc函数重新追加空间 		******动态顺序表的优势********  静态顺序表内存大小固定不变 动态可以随时扩充 
		base = (int *)realloc(L->elem, (L->listsize +10)*sizeof(int));
		L->elem = base;							//更新内存基址 
		L->listsize = L->listsize + 100;		//内存空间增大100单元 
	}
	insert_ptr = &(L ->elem[i-1]);				//insert_ptr为插入位置 
	for(p = &(L ->elem[L->length-1]); p >= insert_ptr; p--)
		*(p+1) =* p;							//将i-1后的元素顺序后移一个元素的位置 
	* insert_ptr = item;						//在第i个位置上插入元素item 
	L->length++;								//表长+1 
} 
 
/******************** 
 *从顺序表中删除元素
 *参数L :Sqlist类型的指针
 *参数i:删除元素的位置
 *********************/
void DelElem(Sqlist *L, int i)
{
	//从顺序表L中删除第i个元素
	int *delitem, *q;
	if(i < 1 || i > L->length)	exit(0);		//非法删除 
	delitem = &(L->elem[i-1]);					//delitem指向第i个元素 
	q = L->elem + L->length-1;					//q指向表尾 
	for(++delitem; delitem <= q; ++delitem)*(delitem-1) =* delitem;	//将第i位置以后的元素依次前移 
	L->length--;								//表长-1 
	 
}

/******************** 
 *测试函数 
 *********************/
int main()
{
	Sqlist l;
	int i;
	initSqlist(&l);
	printf("表中数据:");
	for(i =0; i<15; i++)
		InsertElem(&l, i+1, i+1);
	for(i = 0; i<l.length; i++)
		printf("%3d",l.elem[i]);
		printf("\n删除后的结果:");
	DelElem(&l, 5);
	for(i = 0; i<l.length; i++)
		printf("%3d",l.elem[i]);
	getche();
	
	return 0;
}




猜你喜欢

转载自blog.csdn.net/qq_38663663/article/details/80031586