数据结构(C语言实现)

来源:互联网 发布:软件开发过程控制程序 编辑:程序博客网 时间:2024/04/26 05:58

1.线性表的顺序存储

#include<stdio.h>#include<stdlib.h>#define MAX 20typedef 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;k<L->length;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<stdio.h>#include<stdlib.h>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&&j<i)    {        p=p->next;        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&&j<i)    {        p=p->next;        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&&j<i)    {        p=p->next;        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;}


原创粉丝点击