// 49.cpp : Defines the entry point for the console application.
//
#include "StdAfx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//顺序表动态存储结构 C语言代码实现
#define add_Size 2 //动态扩展内存时,指明扩展的倍数
typedef int DataType;
typedef struct List
{
DataType *data; //指向存储空间基地址
int length; //线性表已存放的数据元素个数
int Max_Size; //线性表可能达到的最大长度,当前分配的存储容量
}SeqList ;
int InitList(struct List *L, int ml)////将线性表L初始化为空表,如果线性表申请内存空间成功,返回1,否则返回-1
{
/* 检查ms是否有效,若无效的则退出运行 */
if(L==NULL) return -1;
if(ml <= 0){
return -1; /* 执行此函数中止程序运行,此函数在stdlib.h中有定义 */
}
L->data = (DataType *)malloc(ml * sizeof(DataType));
if(L->data==NULL){
return -1;
}
L-> Max_Size = ml; /* 设置线性表空间大小为ml */
L->length = 0;
return 1;
}
void DestroyList(SeqList &L){// 释放线性表L所占用的内存空间
free(L.data);
L.data=NULL;
L.length=0;L.Max_Size=0;
}
void DestroyList(SeqList *L){// 释放线性表L所占用的内存空间
free(L->data);
L->data=NULL;
L->length=0;L->Max_Size=0;
}
void ClearList(SeqList &L){ //将线性表L置为空表。
L.length=0;
}
int Locate (struct List *L, DataType y) /*按指定数据元素值y查找,如果找到返回该值位置,否则返回-1 */
{
int i;
for(i = 0; i < L->length; i++){
if(L-> data [i] == y){ //是否找到数据元素y
return (i+1); /* 找到返回该值位置,注意数组的下标是从0开始,线性表的位置是从1开始*/
}
}
return -1; //没找到返回-1
}
void DispList(struct List *L) //显示线性表L的所有数据元素
{
int i;
for(i = 0; i < L->length; i++){
printf("%d ", L ->data[i]);
}
printf("
");
return;
}
void againMalloc(struct List *L) //动态扩展内存,即内存不够用时,重新分配更大的存储空间
{
/* 空间扩展为原来的add_Size倍,并由p指针所指向,原内容被自动拷贝到p所指向的存储空间 */
DataType *p=(DataType*)realloc(L->data,add_Size * L->Max_Size * sizeof(DataType));
if(!p){ /* 分配失败则退出运行 */
printf("存储空间分配失败! ");
exit(1); /* 执行此函数中止程序运行,此函数在stdlib.h中有定义 */
}
L-> data = p; /* 使list指向新线性表空间 */
L-> Max_Size = add_Size * L->Max_Size; /* 把线性表空间大小修改为新的长度 */
return;
}
void InsList(struct List *L, int i, DataType y) //在线性表L中第i个位置插入新的数据元素y。
{ int k;
if(i < 1 || i > L->length + 1){ /* 若i越界则插入失败 */
exit(1); /* 执行此函数中止程序运行,此函数在stdlib.h中有定义 */
}
if(L->length == L-> Max_Size){ /*若线性表存储空间已满, 重新分配更大的存储空间 */
againMalloc(L);
}
for(k = L->length - 1; k >= i - 1; k--){
L-> data [k + 1] = L-> data [k]; //线性表i位置的后继数据元素往后移
}
L-> data [i - 1] = y;//插入的数据元素
L->length++; // 成功加入数据元素,线性表L的长度要加1
return;
}
DataType DelList(struct List *L, int i, DataType &y) //删除L的第i个数据元素,并用y返回其值。
{ int k;
if(i < 1 || i > L->length + 1){ /* 若i越界则插入失败 */
exit(1);
}
if(L->length == L-> Max_Size){ /*若线性表存储空间已满, 重新分配更大的存储空间 */
againMalloc(L);
}
y=L->data[i];
for (k=i;k<=L->length;k++)
{ L->data[k]=L->data[k+1];
}
L->length--;
return y;
}
/* 返回线性表L中第i个元素的值,若i超出范围,则停止程序运行 */
DataType GetData(struct List *L, int i)
{ int k;
if(i < 1 || i > L->length + 1){ /* 若i越界则插入失败 */
exit(1);
return L->data[i];
}
int EmptyList(SeqList L)
{ //如果L为空表则返回1,否则返回0。
if(i < 1 || i > L->length + 1)
{ /* 若i越界则插入失败 */
exit(1);
}
if (L->length)
return 1;
else
return 0;
}
void main()
{//验证
SeqList L;
InitList(&L,100);
InsList(&L,1,99);
InsList(&L,2,55);
InsList(&L,3,44);
InsList(&L,1,33);
InsList(&L,2,22);
DispList(&L);
InsList(&L,6,'b');
DispList(&L);
InsList(&L,6,999);
DispList(&L);
}