一
学渣开始学习数据结构了,所以自己想搞个系列, 慢慢学习,总结自己的错误,理解数据结构的思想以及其代码的推敲,不求吃胖子,只求一步一步。
书本知识来自《大话数据结构》,内容通俗,易于自学吧,代码自己根据此书写的(自己先写代码再去对比书本的代码),雷同很多。思想很重要,在编代码时也发现自己对c语言的陌生,很多错误,慢慢改,慢慢完善。
二
在写代码时主要犯了线性表的位置与数组下标不同的错误
此外还有指针与引用的错误
ListInsert(*&L1, e, ++Len_L1);
ListInsert(&L1, e, ++Len_L1);
warning: passing argument 1 of 'ListInsert' from incompatible pointer type [enabled by default]|
ListInsert(*L1, e, ++Len_L1);
error: incompatible type for argument 1 of 'ListInsert'|
三
#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 20
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int length;
} SqList;
//显示data
Status visit(ElemType e)
{
printf("%d ", e);
return OK;
}
//显示数据表数据
Status ListTraverse(SqList L)
{
int k;
for(k=0; k<L.length; k++)
{
visit(L.data[k]);
}
printf("\n");
return OK;
}
//初始化链表
Status InitList(SqList *L)
{
L->length = 0;
return OK;
}
/**
*链表插入操作
*i为插入位置,e为插入数据
**/
Status ListInsert(SqList *L, ElemType e, int i)
{
int k;
if(L->length == MAXSIZE)//顺序表满
return ERROR;
if(i<1 || i>L->length+1)//添加i位置不正确
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++;
return OK;
}
/**
*数据表数据删除操作
*因没用return返回e值所以使用引用来返回
**/
Status ListDelete(SqList *L, ElemType *e, int i)
{
int k;
if(L->length == 0)//数据表为空
return ERROR;
if(i<1 || i>L->length)//删除i位置不正确
return ERROR;
*e = L->data[i-1];
if(i<=L->length)
{
for(k=i-1; k<L->length; k++)
{
L->data[k] = L->data[k+1];
}
}
L->length --;
return OK;
}
/**
*通过数据项来查找所在位置
**/
int ListLocate(SqList L, ElemType e)
{
int i;
if(L.length == 0)
return 0;
for(i=0; i<L.length; i++)
{
if(L.data[i] == e)
return i+1;
}
return 0;
}
/**
*通过位置i获取数据项e
*因为数组的特性在查找的时间复杂度为O(1)
**/
Status ListGetItem(SqList L, int i, ElemType *e)
{
if(L.length == 0)
return ERROR;
if(i<1 || i>L.length)//查找i的位置不正确
return ERROR;
*e = L.data[i-1] ;
return OK;
}
/**
*数据表长度
**/
int ListLength(SqList L)
{
return L.length;
}
/**
*判断数据表是否为空
**/
Status ListEmpty(SqList L)
{
if(L.length==0)
return OK;
else
return ERROR;
}
/**
*初始条件:顺序线性表L已存在。操作结果:将L重置为空表
**/
Status ListClear(SqList *L)
{
L->length=0;
return OK;
}
/**
*将一个线性表合并到另一个线性表
**/
Status ListMerge(SqList *L1, SqList L2)
{
int i;
ElemType e;
int Len_L1 = ListLength(*L1);
int Len_L2 = ListLength(L2);
if((Len_L1+Len_L2) > MAXSIZE)
return ERROR;
for(i=0; i<L2.length; i++)
{
ListGetItem(L2, i+1, &e);
if(!ListLocate(*L1, e))
ListInsert(*&L1, e, ++Len_L1);
//ListInsert(L1, e, ++Len_L1);同上作用
}
}
int main(void)
{
SqList L;
SqList S;
ElemType e;
int j;
InitList(&L);
for(j=1; j<=5; j++)
{
ListInsert(&L, j, j);
}
ListTraverse(L);
printf("插入的数据表为L->data:");
ListTraverse(L);
printf("LENGTH = %d\n", L.length);
ListInsert(&L, 123, 1);
ListTraverse(L);
// ListDelete(&L, &e, 5);
// printf("删除的数据项:%d\n", e);
// ListTraverse(L);
// printf("LENGTH = %d\n", L.length);
// printf("存在数据表%d的位置\n", ListLocate(L, 6));
// ListGetItem(L, 3, &e);
// printf("查找到的数据项:%d\n", e);
InitList(&S);
for(j=3; j<=13; j++)
ListInsert(&S, j, j-2);
printf("插入的数据表为S->data:");
ListTraverse(S);
ListMerge(&L,S);
printf("依次输出合并了Lb的L的元素:");
ListTraverse(L);
return 0;
}