以前学数据结构时,对于单链表的顺序存储的原理都懂,但是从没有好好地编程实现一下,现在呢,重温数据结构,然后实现了一下.下面是源代码.实现了初始化,创建,查找,删除,定位还有两个链表的合并.
#include<stdio.h>
#define MAXSIZE 20
#define OK 1
#define ERROR 0
#define FALSE 0
typedef int ElemType;
typedef int Status;
typedef struct//定义顺序存储链表的结构体
{
ElemType data[MAXSIZE];
int length;
} SqList;
/******
初始化链表
*/
void InitSqList(SqList *sq)
{
sq->length=0;
}
/*************
创建包含有n个元素的链表
*/
void CreatSqList(SqList *sq,int n)
{
int i;
for(i=0; i<n; i++)
{
sq->data[i]=i+3;//存储的数据从3开始主要是为了后面和另外一个链表合并
}
sq->length=n;
}
void CreatSqList2(SqList *sq,int n)
{
int i;
for(i=0; i<n; i++)
{
sq->data[i]=i+1;
}
sq->length=n;
}
/*******
输出链表
*/
void printSqList(SqList *sq)
{
int i;
for(i=0; i<sq->length; i++)
{
printf("%d ",sq->data[i]);
}
printf("\n");
}
/****
获取第i个位置的元素,赋值给e,成功返回ok
*/
Status GetElem(SqList *L,int i,ElemType *e)
{
if(i<1 || i>L->length || 0==L->length)//判断位置的合理性
{
return ERROR;
}
*e=L->data[i-1];
return OK;
}
/********
链表在第i个位置插入元素e
*/
Status SqListInstert(SqList *L,int i,ElemType e)
{
int k;
if(L->length==MAXSIZE)//判断是否已满
{
return ERROR;
}
if(i<1 || i>L->length+1)//判断插入位置是否合理
{
return ERROR;
}
if(i<=L->length)//如是不是最后一个位置,则插入位置后面的元素全部后移,否则直接插入
{
for(k=L->length-1; k>=i-1; k--)
{
L->data[k+1]=L->data[k];
}
}
L->data[i-1]=e;//赋值
L->length++;//长度加1
return OK;
}
/**************
删除第i个位置的元素,返回所删除位置的值
**/
Status SqListDelete(SqList *sq,int i,ElemType *e)
{
int k;
if(i<1 || i>sq->length)//判断删除位置是否合理
{
return ERROR;
}
*e=sq->data[i-1];
if(i<sq->length)
{
for(k=i-1; k<sq->length-1; k++) //被删除元素的后面的元素全部后移
{
sq->data[k]=sq->data[k+1];
}
}
sq->length--;//长度减1
return OK;
}
/***********
判断元素是否在链表中
*/
Status Location(SqList *la,int e)
{
int i;
for(i=0; i<la->length; i++)
{
if(e==la->data[i])
return OK;
}
if(i==la->length)
{
return ERROR;
}
}
void UnionL(SqList *la,SqList *lb)//求la与lb的并集,把结果保存到la中
{
int la_len,lb_len;//定义链表a,b的长度
int i;
ElemType e;
la_len=la->length;
lb_len=lb->length;
for(i=1; i<=lb_len; i++)
{
if(!GetElem(lb,i,&e))
{
printf("getelem fail!\n");
}
if(!Location(la,e))
{
SqListInstert(la,++la_len,e);
}
}
}
int main()
{
SqList la,lb;
int result;//保存被删除元素的值
int elem;//保存第i个位置的值
int n=10;
int m=5;
InitSqList(&la);//初始化第一个链表la
CreatSqList(&la,n);//创建第一个链表la
printf("the first link was created successly!\nThe first link is:\n");
printSqList(&la);
SqListInstert(&la,5,50);//插入
printSqList(&la);//输出
SqListDelete(&la,5,&result);//删除
printf("%d\n",result);
printSqList(&la);
printf("Get the third elem\n");
GetElem(&la,3,&elem);
printf("%d\n",elem);
InitSqList(&lb);
CreatSqList2(&lb,m);
printf("The second list is:\n");
printSqList(&lb);
UnionL(&la,&lb);
printf("The union list of first and second list is:\n");
printSqList(&la);
return 0;
}
运行结果如图: