数据结构(C语言实现)

1.线性表的顺序存储

#include
#include
#define MAX 20
typedef int DataType ;
typedef struct
{
    int length;
    DataType data[MAX];

}SqList;

int InitList(SqList *L)
{
    //L=(SqList *)malloc(sizeof(SqList));
    L->length=0;
    return 0;
}

int ListEmpty(SqList L)
{
    if(L.length==0)
        return 1;
    else
        return 0;
}

int ClearList(SqList *L)
{
    L->length=0;
    return 0;
}

int getData(SqList *L,int i,DataType *e)
{
    if(L->length==0||i<1||i>L->length)
        return 0;
    else
        *e=L->data[i-1];
    return 1;
}

int ListInsert(SqList *L,int i,DataType e)
{
    int k;
    if(L->length==MAX)
    {
       // printf("顺序表已满\n");
        return 0;
    }
    if(i<0||i>L->length+1)
    {
        //printf("插入位置不合法\n");
        return 0;
    }
    else
    {
        for(k=L->length-1;k>=i-1;k--)
            L->data[k+1]=L->data[k];
    }
    L->data[i-1]=e;
    L->length++;
    return 1;
}

int ListDelete(SqList *L,int i,DataType *e)
{
    int k;
    if(i<1||i>L->length)
        return 0;   //删除位置不正确
    if(L->length==0)
        return 0;   //空表
    *e=L->data[i-1];
    if(i<=L->length)
    {
         for(k=i;klength;k++)
            L->data[k-1]=L->data[k];
    }
    L->length--;
    return 0;
}

int ListTraverse(SqList L)
{
    int i;
    for(i=0;i<=L.length-1;i++)
    {
        printf("%3d",L.data[i]);
    }
    printf("\n");
    return 1;
}

int main()
{
    int i,j,k;
    SqList L;
    DataType e;
    i=InitList(&L);
    printf("初始化后表长:%d\n",L.length);

    for(j=1;j<=5;j++)
        i=ListInsert(&L,1,j);
    printf("表头插入数字1到5之后:");
    ListTraverse(L);
    printf("插入五个数字后表长:%d\n",L.length);

    i=ListEmpty(L);
    printf("此时表是否为空(1代表是,0代表否):%d\n",i);

    i=ClearList(&L);
    printf("\n清空表后,表长为%d\n",L.length);
    printf("此时表是否为空(1代表是,0代表否):%d\n",i);
    for(j=1;j<=5;j++)
        i=ListInsert(&L,j,j);
    printf("表尾插入五个数字之后:");
    ListTraverse(L);
    printf("插入五个数字后表长:%d\n",L.length);

    getData(&L,3,&e);
    printf("第三个数字是:%d\n",e);

    i=ListDelete(&L,2,&e);
    printf("删除第2个数据后为:");
    ListTraverse(L);
    printf("被删除的数字是:%d\n",e);

    i=L.length;
    printf("输入想要删除的数据的序号:");
    scanf("%d",&k);
    if(k>i||k<=0)
        printf("删除位置不正确\n");
    else
    {
        i=ListDelete(&L,k,&e);
        printf("删除第%d个数字的值为%d,删除后表为",k,e);
        ListTraverse(L);
    }
    return 0;
}

结果:



1>数组的下表从0开始,防止数组越界

2>注意指针的使用

3>设计程序时尽量考虑全面,各种可能出现的问题都包含在内

4>变量命名要有一定的含义,见其名知其意


2.线性表链式存储

#include
#include
typedef int ElemType;
typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node,*LinkList;


int InitList(LinkList *L)//初始化
{
    *L=(LinkList)malloc(sizeof(Node));
    if(!(*L))
        return 0;
    else
        (*L)->next=NULL;
    return 1;
}
//LinkList L,L有定义时,值要么为NULL,为一个空表,要么为第一个节点的地址,既头指针
int ListLength(LinkList L)//求表长,LinkList L指某链表的第一个节点地址放在指针变量L中
{
    int i=0;
    LinkList p=L->next;
    while(p)
    {
        i++;
        p=p->next;
    }
    return i;
}

int ListEmpty(LinkList L)
{
    LinkList p=L->next;
    if(p)
        return 0;
    else
        return 1;
}

int ClearList(LinkList *L)//整表删除
{
    LinkList p,q;
    p=(*L)->next;//P指向第一个结点
    while(p)
    {
        q=p->next;
        free(p);
        p=q;
    }
    (*L)->next=NULL;//头结点指针域为空
    return 1;
}

int GetElem(LinkList L,int i,ElemType *e)
{
    int j=1;
    LinkList p;
    p=L->next;
    while(p&&jnext;
        j++;
    }
    if(!p||j>i) //if(!p||j>=i)
    {

        return 0;
    }
    *e=p->data;
    return 1;
}

int ListTraverse(LinkList L)
{
    LinkList p=L->next;
    while(p)
    {
        printf("%3d",p->data);
        p=p->next;
    }
    printf("\n");
    return 1;
}

int ListInsert(LinkList *L,int i,ElemType e)
{
    LinkList p,s;
    p=*L;
    int j=1;
    while(p&&jnext;
        j++;
    }
    if(!p&&j>i)
    {
        return 0;
    }
    else
        s=(LinkList)malloc(sizeof(Node));
        s->data=e;
        s->next=p->next;
        p->next=s;

    return 1;
}

int ListDelete(LinkList *L,int i,ElemType *e)
{
    int j=1;
    LinkList p,q;
    p=*L;
    while(p->next&&jnext;
        j++;
    }
    if(!(p->next)||j>i)
        return 0;
    q=p->next;
    p->next=q->next;
    *e=q->data;
    free(q);
    return  1;
}

int main()
{
    LinkList L;
    ElemType e,f;
    int i,j,k,m;
    i=InitList(&L);
    printf("初始化后长度为:L.length=%d\n",ListLength(L));

    for(j=1;j<=5;j++)
    {
        i=ListInsert(&L,1,j);
    }
    printf("在表头插入1到5之后:L.data=");
    ListTraverse(L);

    printf("表长:ListLength=%d\n",ListLength(L));

    i=ListEmpty(L);
    printf("表是否为空:i=%d(1代表是,0代表否)\n",i);

    i=ClearList(&L);
    printf("清空表后表长:ListLength=%d\n",ListLength(L));
    i=ListEmpty(L);
    printf("表是否为空:i=%d(1代表是,0代表否)\n",i);

    for(j=1;j<=5;j++)
    {
        i=ListInsert(&L,j,j);
    }
    printf("表尾插入1到5之后:L.data=");
    ListTraverse(L);

    i=ListLength(L);
    printf("你想查找第几个元素?");
    scanf("%d",&k);
    if(k>0&&k<=i)
    {
        GetElem(L,k,&e);
        printf("第%d个元素的值是%d\n",k,e);
    }
    else
        printf("查找元素不存在\n");

    j=ListLength(L);
    printf("你想删除第几个数字?");
    scanf("%d",&m);
    if(m>0&&m<=j)
    {
        ListDelete(&L, m,&f);
        printf("删除成功,删除的数字是%d\n",f);
        printf("删除后表为:");
        ListTraverse(L);
    }
    else
        printf("不存在此元素\n");
    return 0;
}


你可能感兴趣的:(C/C++)