一、对数据结构进行深入学习
1、顺序表加入按顺序查找
// 删除数据:根据数值删除数据
// s :要删除的顺序表
// data: 要删除的数据
// 返回值:成功返回 TRUE,失败返回FALSE,其他返回ERROR
BOOL Delete_data(Sqe* s,Data data);
BOOL Delete_data(Sqe* s,Data data)
{
if(NULL == s)
return ERROR;
int i;
for(i = 0 ; i < s->Size; i++)
{
if(s->pData[i] == data)
{
Delete_pos(s,i);
return TRUE;
}
}
return FALSE;
}
2、顺序表加入按数据查找
// 查找数据:根据数值查找数据
// [in]s :要查找的顺序表
// [in]data: 要查找的数据
// [out]pIndex:查找到的元素下标
// 返回值:成功返回 TRUE,失败返回FALSE,其他返回ERROR
BOOL Find_Data(Sqe* s,Data data,int *pIndex);
BOOL Find_Data(Sqe* s,Data data,int *pIndex)
{
if(NULL == s)
return ERROR;
int i;
for(i = 0 ; i < s->Size; i++)
{
if(s->pData[i] == data)
{
*pIndex = i;
return TRUE;
}
}
return FALSE;
}
3、修改某个数据
// 修改数据:根据数值修改数据
// [in]s :要修改的顺序表
// [in]data: 要修改成的数据
// [in]index:要修改的下标
// 返回值:成功返回 TRUE,失败返回FALSE,其他返回ERROR
BOOL Modify_Data(Sqe* s, int index, Data data);
BOOL Modify_Data(Sqe* s, int index, Data data)
{
if(NULL == s || index < 0 || index > s->Size)
return ERROR;
s->pData[index] = data;
return TRUE;
}
4、合并两张表
// 合并顺序表 (从大到小排序)
// [in]s1:要合并的第一个顺序表
// [in]s2: 要合并的第二个顺序表
// 返回值:成功返回 s3,失败返回NULL
Sqe * Merge(Sqe *s1,Sqe *s2);
Sqe * Merge(Sqe *s1,Sqe *s2)
{
if(NULL == s1 || NULL == s2)
return NULL;
//s3的创建
Sqe *s3 = (Sqe *)malloc(sizeof(Sqe)/sizeof(char));
if(NULL == s3)
{
return NULL;
}
s3->pData=(Data *)malloc(sizeof(Data)/sizeof(char)*(s1->Size + s2->Size));
if(NULL == s3->pData )
{
free(s3);
return NULL;
}
s3->MaxSize = s1->Size + s2->Size;
s3->Size = s1->Size + s2->Size;
//给s3填入数据
int i = 0;
int j = 0;
int k = 0;
while(i < s1->Size && j < s2->Size) //有一个结束,就不用判断了
{
if(s1->pData[i] < s2->pData[j])
s3->pData[k++] = s1->pData[i++];
else
s3->pData[k++] = s2->pData[j++];
}
while(i < s1->Size) //其中 一个到头后将剩下一个数组中的值全部给s3
s3->pData[k++] = s1->pData[i++];
while( j < s2->Size)
s3->pData[k++] = s2->pData[j++];
return s3;
}
二、单链表
1、链表存储有两个域,一个存放数据,一个存放要指向的地址
2、链表的优点:避免删除添加大量数据使数据大量移动
3、单链表的分类:
头指针式链表
头结点式链表(经常使用这种)
4、一组单链表在内存中的形式
5、单链表按位置插入
先看一张图
这样就能明白插入时要找前一个结点。
核心的代码
6、单链表逆序
提示:可以运用两个指针实现
核心代码
Node *pre = ls->head->next; //第一个结点
Node *cur = pre->next; //要换的结点
Node *tmp; //保存指向下一个地址
while(cur)
{
tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
ls->head->next->next = NULL;
ls->head->next = pre;
7、一些链表题目的思路
(1)两个链表相交找到相交的点
找到长度长的链表,让长的链表先走长度差值的步数。在同时走遇到的第一个交点就是两个链表的交点。
(2)找到链表倒数第K个值
先让一个指针走K,再同时匀速走,当第一个走完,第二个指针就在倒数第K的位置
(3)判断链表有没有环
让2个指针以不同的速度走,如果相遇则有环。
(4)如果有环,判断环的点在哪
让2个指针以不同的速度走,如果相遇则有环。在交点的地方设一个指针P3,起点设一个指针P4。匀速走当他们相交就是交点处。