您的位置:首页 > 编程语言 > C语言/C++

线性表的顺序表示及实现(C语言编写)

2011-12-03 16:19 507 查看
#include<stdio.h>

#include<malloc.h> //注意这个分配地址的头文件必须得加

#define INITIAL_SIZE 100 //定义线性表的初始大小

#define INCREACEMENT 10 //定义线性表的分配增量

//定义一个线性表结构

struct List

{

int *Elem; //线性表的基址

int Length; //当前长度

int Allocate_size; //当前分配的容量

}*L;

//初始化线性表

void Init_List(List &L)

{



L.Elem=(int *)malloc(INITIAL_SIZE* sizeof(int)); //分配基地址

if (!L.Elem ) return;

L.Length =0; //初始长度为0

L.Allocate_size =INITIAL_SIZE; //初始分配的大小为100

}

//向线性表中插入一个数

void InsertInto_List(List &L,int i,int e)

{

int *p,*q;

if (i>L.Length+1 || i<1)return; //先判断要插入的序号在不在线性表长度之内

if(L.Length>=L.Allocate_size) //如果线性表的长度大于等于分配的大小时,需重新分配线性表大小

{

int *newbase=(int *)realloc(L.Elem ,(L.Length +INCREACEMENT)*sizeof(int));

if (!newbase)return;

L.Elem =newbase; //基地址改变

L.Allocate_size +=INCREACEMENT; //分配的大小加倍

}

q=&(L.Elem [i-1]); //要插入的位序

for (p=&(L.Elem [L.Length-1]);p>=q;p--) //循环实现要插入位置以后的数都要后移一位

{

*(p+1)=*p;

}

*q=e;
//给要插入的位序赋值要插入的值

L.Length +=1; //线性表加1



}

//删除线性表中一个数

void delete_List(List &L,int i,int &e)

{

int *p,*q;

if (i<1||i>L.Length )return ; //先判断要删除的位序的值是否在线性表中

else

{

p=&L.Elem [i-1]; //要删除的位序

e=*p; //将删除的数赋值给e

q=L.Elem +L.Length -1; //线性表最后的位序

for (++p;p<=q;++p)*(p-1)=*p; //循环实现删除位序后的数据前移一位

--L.Length ; //线性表长度减一

}

}

//实现两个数相比较

bool compare(int a,int b)

{

if (a==b)return true;

else return false;

}

//查找一个数在线性表中的位序

int Locate_List(List &L,int e)

{

for (int i=1;i<L.Length;i++ )

{

if (compare(e,L.Elem[i]))

return i;

}

return 0;

}

void main()

{

//要插入的值

int InsertNum=89;

int SeletNum=76;

int compareNum=76;

int returnValue; //要返回的值

//注意要首先初始化L,因为一开始L是不指向任何地址的,

//只有malloc一个地址给他,L才指向一个有意义的地址,*L才能真正得到一个struct List,之后的所有对L的使用才有意义

L=(List *)malloc(sizeof(struct List));

Init_List(*L); //初始化线性表

//插入数据

InsertInto_List(*L,1,InsertNum);

InsertInto_List(*L,2,InsertNum);

InsertInto_List(*L,3,SeletNum);

delete_List(*L,2,returnValue); //删除数据

int Locate= Locate_List(*L,InsertNum); //查找一个数在线性表中的位序

printf("%d 在线性表中的位序为: %d\n",compareNum,Locate); //输出查找到的位序

}

输出的截图:



建议:在编写过程中要把struct 对象*L初始化,因为一开始L是不指向任何地址的,只有malloc一个地址给他,L才指向一个有意义的地址,*L才能真正得到一个struct List,之后的所有对L的使用才有意义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: