您的位置:首页 > 理论基础 > 数据结构算法

C语言数据结构——顺序表

2016-01-07 22:11 513 查看
  数据结构的一些讲解,供学习者参考,也顺带作为复习

  线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表的各元素,用这种存储形式存储的线性表称为顺序表。因为内存中的地址空间是线性的,因此,用物理上的相邻实现数据元素之间的逻辑相邻关系既是简单又自然的。



将数据存储区data和指针last封装成一个结构体作为顺序表的类型

struct LinearList<span style="white-space:pre">		</span>/*定义顺序表结构*/
{
<span style="white-space:pre">	</span>int *list;<span style="white-space:pre">			</span>/*存顺序表元素*/
<span style="white-space:pre">	</span>int size;<span style="white-space:pre">			</span>/*存顺序表长度*/
<span style="white-space:pre">	</span>int MaxSize;<span style="white-space:pre">		</span>/*存list数组元素的个数*/

};


顺序表的初始化

/*顺序表的初始化函数*/
void InitList (LIST *L,int ms)
{
<span style="white-space:pre">	</span>if((L->list=(int *)malloc(ms*sizeof(int)))==NULL)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>printf("内存申请失败!\n");
<span style="white-space:pre">		</span>exit(1);
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>L->size = 0;
<span style="white-space:pre">	</span>L->MaxSize = ms;
<span style="white-space:pre">	</span>printf("链表创建成功!\n");
}


顺序表的插入算法

/*顺序表的插入算法,item:记录插入的值;rc:记录插入的位置*/
int InsertList(LIST *L, int item, int rc)
{
int i;
if((L->size)>=L->MaxSize)
return -1;				/*顺序表已满*/
if(rc<0)					/*插入位置为0到L->size*/
rc = 0;
if(rc>L->size)
rc = L->size;
for(i=L->size-1;i>=rc;i--)			/*将rc后面的元素后移*/
L->list[i+1]=L->list[i];
L->list[rc]=item;
L->size++;
return 0;
}


输出顺序表的所有元素

/*输出顺序表所有元素*/
void OutputList(LIST *L)
{
int i;
for(i=0;i<L->size;i++)
printf("%d",L->list[i]);
printf("\n");
}


顺序表的查找算法

/*查找算法*/
int FindList(LIST *L,int item)
{
int i;
for(i=0;i<L->size;i++)
if(L->list[i]==item)			/*找到相同元素,返回元素的位置*/
return i;
return -1;						/*无法找到,返回-1*/
}


顺序表的删除算法

/*删除元素,item:删除元素的值*/
int DeleteList_1( LIST *L,int item)
{
int i,n;
for(i=0;i<L->size;i++)				/*找到相同的元素*/
if(item==L->list[i])
break;
if(i<L->size)
{
for(n=i;n<L->size-1;n++)
L->list
= L->list[n+1];
L->size--;
return i;
}
return -1;
}


删除顺序表指定位置的元素

/*删除指定位置的数据*/
int DeleteList_2( LIST *L,int rc)
{
int n;
if(rc<0||rc>L->size)
return -1;
for(n=rc;n<L->size-1;n++)
L->list
=L->list[n+1];
L->size--;
return 0;
}


主函数代码,仅供学习参考

void main()
{
LIST LL;			/*顺序表*/
int i,r,n,model;	/*i:元素值;r:插入位置;n:顺序表长度;model:选择行为模式*/
printf("请输入所需链表的长度:\t");
scanf("%d",&n);
fflush(stdin);
InitList(&LL,n);
printf("list addr = %p\tsize = %d\tMaxSize = %d\n",LL.list,LL.size,LL.MaxSize);

while(1)
{
printf("请选择你需要的操作\n【1】插入数据\n【2】查找数据\n【3】删除特定位置的数据\n【4】删除链表中的某个数据\n【5】遍历并输出线性表\n【6】退出\n");
scanf("%d",&model);
fflush(stdin);
switch(model)
{
case 1:
while(1)
{
printf("请输入插入元素值:\t");
scanf("%d",&i);
if(i==0)
break;
printf("请输入插入的位置:\t");
scanf("%d",&r);
if((InsertList(&LL,i,r-1))==-1)
printf("插入失败!");
printf("当前线性表为:\n");
OutputList(&LL);
}
break;
case 2:
while(1)
{
printf("请输入查找元素值:\t");
scanf("%d",&i);
if(i==0)
break;
r=FindList(&LL,i);
if(r<0)
printf("没有找到\n");
else
printf("元素位置为:%d\n",r+1);
}
break;
case 3:
while(1)
{
printf("请输入删除的元素位置:\t");
scanf("%d",&r);
if(r==0)
break;
i=DeleteList_2(&LL,r-1);
if(i<0)
printf("位置越界\n");
else
{
printf("线性表为:");
OutputList(&LL);
}
}
break;
case 4:
while(1)
{
printf("请输入删除的元素值:\t");
scanf("%d",&i);
if(i==0)
break;
r=DeleteList_1(&LL,i);
if(r<0)
printf("没有找到该元素\n");
else
{
printf("位置为%d的元素已经删除\n",r+1);
printf("线性表为:");
OutputList(&LL);
}
}
break;
case 5:
OutputList(&LL);
break;
case 6:
exit(0);
default:
printf("请重新输入:\n");
break;
}
}


运行结果如下图



需要源代码的欢迎下载,免积分,共同学习,接下来会每天分享一篇,持续一个星期
http://download.csdn.net/detail/kevin_iot/9395161
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: