欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构(一)线性表-线性表的顺序表示 顺序表 C语言实现

程序员文章站 2024-01-15 19:51:22
...

目录

1.2.1 顺序表的定义

1.2.2 顺序表上基本操作的实现

 (1)顺序表的建立

 (2)顺序表元素的插入

 (3)顺序表元素的删除

 (4)顺序表的查找



1.2.1 顺序表的定义

 定义:顺序表是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使的逻辑上相邻的两个元素在物理位置上也相邻。

数据结构(一)线性表-线性表的顺序表示 顺序表 C语言实现

 特点

  • 表中元素的逻辑顺序与物理顺序相同。
  • 随机访问,即通过首地址和元素序号可在时间O(1)内找到指定的元素。
  • 存储密度高,每个节点只存储数据元素。
  • 逻辑上相邻的元素物理上也相邻,所以插入和删除操作需要移动大量元素。

1.2.2 顺序表上基本操作的实现

 (1)顺序表的建立

// 头文件SeqList.h开始
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define  OK  1
#define  ERROR 0
#define  OVERFLOW  0
#define  LIST_INIT_SIZE  100                     	//  存储空间初始分配量
#define  LISTINCREMENT 10 //存储空间分配增量
typedef  struct
{
	int *elem;
	int  length;   //当前表长
	int listsize;                       	//  当前分配的存储容量

}SeqList;

int  InitList_Seq( SeqList  *L )                   //  构造一个空的顺序表
{
	L->elem = (int *)malloc(LIST_INIT_SIZE*sizeof (int));
	if (!L->elem)
	{ printf("Out of space!!\n");    	         //  存储分配失败
        exit(OVERFLOW);
	}
	L->length = 0;
	L->listsize = LIST_INIT_SIZE;
	return OK;
}

int Output_SeqList(SeqList  L)
{
     int i;
     for(i=0;i<L.length;i++)
	   printf ("%4d",L.elem[i]);
	 printf("\n");
     return OK;
}
// 头文件SeqList.h结束
// 主程序文件 CreateSeqList.c
int CreateList_Seq(SeqList L)
{//  建立顺序表
	int i;
	printf ("Input the datas: ");
	for(i=0;i<L.length;i++)
		scanf ("%d",&L.elem[i]);
	return OK;
}

void  main( )
{
	int n;
	SeqList L;
	InitList_Seq (&L);
	printf ("\n Input the length of the list L: ");	// 输入顺序表的长度
	scanf("%d",&n);
	L.length = n;
	CreateList_Seq (L);
	printf ("Output the datas: "); 					// 输出顺序表
	Output_SeqList(L);
	printf("\n");
	printf("the lenth of the List L: %d",L.length); 
}

 运行结果:

数据结构(一)线性表-线性表的顺序表示 顺序表 C语言实现

 (2)顺序表元素的插入

#include "SeqList.h"

int CreateList_Seq(SeqList L)                              //建立顺序表
{
	int i;

	printf("Input the datas: ");
	for(i=0;i<L.length;i++)
		scanf("%d",&L.elem[i]);
	return OK;
}

int ListInsert_Seq(SeqList *L,int i,int e)           ////在第 i 个元素之前插入元素至顺序表
{
	int *p,*q,*newbase;

	if((i<1)||(i>L->length+1))
		return ERROR;
	if(L->length>=L->listsize)                       // 当前空间已满,增加分配
	{
		newbase = (int *)realloc(L->elem,(L->length+LISTINCREMENT)*sizeof(int));
		if(!newbase)
			exit(OVERFLOW);
		L->elem = newbase;
		L->listsize += LISTINCREMENT;
	}
	
	q = &L->elem[i-1];	                     //  q 指向插入位置
	for(p=&L->elem[L->length-1];p>=q;p--)    // 第 n 至第 i 个元素依次后移一个位置
		*(p+1) = *p;
	*q = e;					                 // 插入新元素 e
	L->length++;                             /////// 注意!要传值回去,形参L 必须用指针变量
    return OK;
}

int main()		//在顺序表的第i个位置插入元素e 
{
	int i,n,e;
	SeqList L;
	InitList_Seq(&L);////
	printf("\nInput the length of the list L: ");
	scanf("%d",&n);
	L.length = n;
	CreateList_Seq(L);////
    printf("Input the insert data: ");
	scanf("%d",&e);
	printf("Input the insert location: ");
	scanf("%d",&i);
	if(ListInsert_Seq(&L,i,e))////
	{
		printf("Output the datas:");
		Output_SeqList(L);
	}
	else
		printf("Can't insert the data!\n");
	
	return 0;
}

运行结果:

数据结构(一)线性表-线性表的顺序表示 顺序表 C语言实现

 (3)顺序表元素的删除

  • 删除表中第i个元素并用变量*e返回其值。
#include "SeqList.h"
int CreateList_Seq(SeqList L)
{
	int i;
	printf("Input the datas: ");
	for(i=0;i<L.length;i++)
		scanf("%d",&L.elem[i]);
	return OK;
}

int ListDelete_Seq(SeqList *L, int i, int *e)////  
{
	int *p,*q;
	if((i<1)||(i>L->length))////
		return ERROR;
	p = &L->elem[i-1];////p指向要删除元素的地址 
//	printf("p: %d",*p);
//	printf("\n"); 
	*e = *p;
	q = L->elem + L->length-1;////令q指向最后一个元素的地址 
	for(++p; p<=q; p++)
		*(p-1) = *p;
	L->length--;////
	return OK;
}

void main()
{
	int i,n,e;////
	SeqList L;////
	InitList_Seq(&L); ////
	printf("\nInput the length of the list L: ");
	   scanf("%d",&n);
	L.length = n;
	CreateList_Seq(L);////
	printf("Input the delete location: ");
	   scanf("%d",&i);
	if(ListDelete_Seq(&L,i,&e))
	{	printf("Delete the data %d:\n",e);////
		printf("Output the datas: ");
		Output_SeqList(L);
	}
	else
		printf("Can't find the delete data!\n");

}

运行结果:

数据结构(一)线性表-线性表的顺序表示 顺序表 C语言实现

 (4)顺序表的查找

#include "SeqList.h"

int CreateList_Seq(SeqList L)
{
	int i;

	printf("Input the datas: ");
	for(i=0;i<L.length;i++)
		scanf("%d",&L.elem[i]);
	return OK;
}

int LocateElem(SeqList L,int e)
{
	int i;
	i = 0;
	while(i<=L.length-1 && L.elem[i] != e)
		++i;
	if(i<L.length)
		return i;
	else
		return -1;
}

void main()
{
	int i,n,e;
	SeqList L;
	InitList_Seq(&L);

	printf("\nInput the length of the list L: ");
	   scanf("%d",&n);
	L.length = n;
	CreateList_Seq(L);
	printf("Input the search data: ");
	scanf("%d",&e);
	if((i=LocateElem(L,e))>=0)
	   printf("The search data subscript is %d in the L\n",i);
	else
	   printf("There is no search data in the L!\n");
	printf("Output the datas: ");
	Output_SeqList(L);
}

运行结果: 

数据结构(一)线性表-线性表的顺序表示 顺序表 C语言实现