单链表顺序存储相关操作的c语言实现

来源:互联网 发布:淮南网络宾馆 编辑:程序博客网 时间:2024/05/28 16:04
以前学数据结构时,对于单链表的顺序存储的原理都懂,但是从没有好好地编程实现一下,现在呢,重温数据结构,然后实现了一下.下面是源代码.实现了初始化,创建,查找,删除,定位还有两个链表的合并.
#include<stdio.h>#define MAXSIZE 20#define OK 1#define ERROR 0#define FALSE 0typedef 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;}
运行结果如图:
1 0
原创粉丝点击