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;
}