数据结构(C语言实现)
1.线性表的顺序存储
- #include<stdio.h>
- #include<stdlib.h>
- #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;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;
- }
#include<stdio.h>
#include<stdlib.h>
#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;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;
- }