顺序表的结构在内存中表示为一段连续区域.所以顺序表的维护实际上是对内存一段连续内存的维护。其根本保证在插入,删除元素后顺序表组织在内存中仍是连续性的。因此它的优点是:定位速度快;不足处:编辑顺序表需要进行多次移动元素.
使用 Turboc2 环境.
#include <stdio.h>
/*
1.初使化顺序表
2.销毁顺序表
3.添加元素
4.插入元素
5.删除元素
6.查询指定元素值索引
*/
typedef struct node
{
int *ele;
int size;
int length;
} NODE;
/*初使化顺序表*/
int IniList(NODE *L,int size)
{ /* *L:顺序表 size: 顺序表大小 */
L->ele = (int *)malloc(size * sizeof(int));
if(L->ele == NULL) return 0;
L->length = 0;
L->size = size;
return 1;
}
/*返回第一个等于data值元素的位序; *index >= 1 */
int SearchElemAt(NODE L,int data,int *index)
{
int i;
for(i = 0; i < L.length ; i++)
{
if(L.ele[i] == data)
{
*index = i + 1;
return 1;
}
}
return 0;
}
/*注销顺序表*/
void DestroyList(NODE *L)
{
free(L->ele);
L->ele = NULL;
L->length = L->size = 0;
}
/*判断顺序表是否满栈*/
int IsFull(NODE L)
{
return L.length == L.size;
}
/*判断顺序表是否为空表*/
int IsEmpty(NODE L)
{
return L.length == 0;
}
/*插入元素到顺序表末尾*/
int AddElem(NODE *L,int data)
{
if(IsFull(*L)) return 0;
L->ele[L->length] = data;
L->length++;
return 1;
}
/*删除顺序表*/
int DeleteListAt(NODE *L,int index)
{/* index :删除元素位序. 1<= index <= L->length */
int k;
if(index < 1 || index > L->length ) return 0;
for(k = index - 1 ; k < L->length - 1 ; k++)
{
L->ele[k] = L->ele[k+1];
}
L->length--;
return 1;
}
/*插入元素到指定位序*/
int InsertElemAt(NODE *L,int index,int data)
{/* index :插入位序 1<= index <= L->length; data:插入元素数值*/
int k;
if(IsFull(*L)) return 0;
if(index < 1 || index > L->length) return 0;
for(k = L->length ; k > index-1 ; k--)
{
L->ele[k] = L->ele[k-1];
}
L->ele[index-1] = data;
L->length++;
return 1;
}
/*遍历顺序表*/
void foreach(NODE L)
{
int k;
for(k = 0 ; k < L.length ; k++)
{
printf("/n %d",L.ele[k]);
}
}
/*升序插入元素*/
int InsertElemSort(NODE *L,int data)
{
int k;
if(IsFull(*L)) return 0;
if(IsEmpty(*L)) /*如果是空表则直接在末尾添加元素*/
{
return AddElem(L,data);
}
for(k = 0 ; k < L->length ; k++)
{
if(L->ele[k] > data)
{
break;
}
}
if(k == L->length) /*整表元素均小于 data,在末尾添加元素*/
return AddElem(L,data);
/*指定位序表加元素*/
return InsertElemAt(L,k+1,data);
}