typedefine:函数执行的时候,进行符号的转换。
define:只做简单的替换,预处理
区别:
预处理:展开文件,对预处理的命令替换。
如何定义一个函数指针:先定义指针,*p,括号起来。再在
指针:存放地址的。存放内部值要加*
sizeof:数组占的空间,8个 ,字符串占8个字节
strlen:字符占的空间,7,字符串占7个字节,不加\0,所以少一个字节。
顺序表的书写思路:首先,创建目录,进入目录,建立三个文件夹,一个.c文件,一个main.c文件,一个.h文件。
在这个.h文件中,需要写头文件。结尾加#endif。
一般在.h文件中:
需要定义一个结构体,
#ifndef SQLIST_H
#define SQLIST_H
typedef struct sqlist_s
{
int *data; 定义一个数据指针
int cur_len; 定义当前长度
int size; 定义表的大小
}sqlist_t;
#define SUCCESS 0 用来判断对错
#define FAILED -1 用来判断对错
再定义函数,
int sqlist_head_add(sqlist_t *sqlist,int data); 头插
int sqlist_tail_add(sqlist_t *sqlist,int data); 尾插
int sqlist_insert(sqlist_t *sqlist,int data,int pos);
int sqlist_del_data(sqlist_t *sqlist,int data); 删除数据
int sqlist_del_position(sqlist_t *sqlist,int pos); 删除位置
int sqlist_get_data_pos(sqlist_t *sqlist,int data); 获取制定位置的数据。
int sqlist_get_pos_data(sqlist_t *sqlist,int pos); 获取制定的数据位置
int sqlist_reserve(sqlist_t *sqlist); 逆序
int sqlist_merge(sqlist_t *new_sqlist,sqlist_t sqlist1,sqlist_t sqlist2); 合并
void sqlist_display(sqlist_t sqlist); 遍历
int sqlist_init(sqlist_t *sqlist); 分配
int sqlist_destroy(sqlist_t *sqlist); 损毁
其次在.c文件中:包含四个头文件,然后写每个函数功能。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include “sqlist.h”
void sqlist_display(sqlist_t sqlist)
{
int i;
printf(“display sqlist\n”);
for(i = 0;i < sqlist.cur_len;i++)
{
printf(“sqlist position: %d ,data : %d\n”,i+1,sqlist.data[i]);
}
printf("==============================\n");
}
int sqlist_increase(sqlist_t *sqlist)
{
int *ptr=realloc(sqlist->data,(sqlist->size + INCREASE_SIZE) *sizeof(int));
if(ptr == NULL)
{
printf("%s:%d :ptr is NULL\n",FUNCTION,LINE);
return FAILED;
}
memset(ptr+(sqlist->size * sizeof(int)),0,INCREASE_SIZE * sizeof(int));
sqlist->data = ptr;
sqlist->size += INCREASE_SIZE;
return SUCCESS;
}
int sqlist_init(sqlist_t *sqlist)
{
if(sqlist == NULL)
{
printf("%s:%d :sqliist is NULL\n",FUNCTION,LINE);
return FAILED;
}
sqlist->cur_len = 0;
sqlist->size = INIT_SIZE;
sqlist->data = (int *)malloc(INIT_SIZE * sizeof(int));
if(sqlist->data == NULL)
{
printf("%s:%d :malloc failed \n",__FUNCTION__,__LINE__);
return FAILED;
}
memset(sqlist->data,0,sizeof(int) * INIT_SIZE);
return SUCCESS;
}
int sqlist_destroy(sqlist_t *sqlist)
{
if(sqlist == NULL)
{
printf("%s:%d :sqliist is NULL\n",FUNCTION,LINE);
return FAILED;
}
if(sqlist->data == NULL)
{
printf("%s:%d :sqlist->data is NULL\n",__FUNCTION__,__LINE__);
return FAILED;
}
free(sqlist->data);
sqlist->data = NULL;
return SUCCESS;
}
int sqlist_tail_add(sqlist_t *sqlist,int data)
{
int ret;
if(sqlist == NULL)
{
printf("%s:%d :sqliist is NULL\n",FUNCTION,LINE);
return FAILED;
}
if(sqlist->cur_len >= sqlist->size)
{
ret = sqlist_increase(sqlist);
if(ret == FAILED)
{
printf("%s:%d :sqlist_increase failed\n",__FUNCTION__,__LINE__);
return FAILED;
}
}
sqlist->data[sqlist->cur_len] = data;
sqlist->cur_len++;
return SUCCESS;
}
int sqlist_head_add(sqlist_t *sqlist,int data)
{
int ret;
int i;
if(sqlist == NULL)
{
printf("%s:%d :sqliist is NULL\n",FUNCTION,LINE);
return FAILED;
}
if(sqlist->cur_len >= sqlist->size)
{
ret = sqlist_increase(sqlist);
if(ret == FAILED)
{
printf("%s:%d :sqlist_increase failed\n",__FUNCTION__,__LINE__);
return FAILED;
}
}
for(i = sqlist->cur_len;i>0;i--)
{
sqlist->data[i] = sqlist->data[i - 1];
}
sqlist->data[0] = data;
sqlist->cur_len++;
return SUCCESS;
}
int sqlist_insert(sqlist_t *sqlist,int data,int pos)
{
int i;
int ret;
if(sqlist == NULL)
{
printf("%s:%d :sqliist is NULL\n",__FUNCTION__,__LINE__);
return FAILED;
}
if(pos < 1 || pos > sqlist->cur_len)
{
printf("pos is invaild value\n");
return FAILED;
}
if(sqlist->cur_len >= sqlist->size)
{
ret = sqlist_increase(sqlist);
if(ret == FAILED)
{
printf("%s:%d :sqlist_increase failed\n",__FUNCTION__,__LINE__);
return FAILED;
}
}
for(i = sqlist->cur_len;i>=pos;i--)
{
sqlist->data[i] = sqlist->data[i - 1];
}
sqlist->data[pos - 1] = data;
sqlist->cur_len++;
return SUCCESS;
}
int sqlist_del_position(sqlist_t *sqlist,int pos)
{
int i;
if(sqlist == NULL)
{
printf("%s:%d :sqliist is NULL\n",__FUNCTION__,__LINE__);
return FAILED;
}
if(pos < 1 || pos > sqlist->cur_len)
{
printf("pos is invaild value\n");
return FAILED;
}
for(i = pos;i < sqlist->cur_len;i++)
{
sqlist->data[i - 1] = sqlist->data[i];
}
sqlist->cur_len--;
return SUCCESS;
}
int sqlist_del_data(sqlist_t *sqlist,int data)
{
int i;
int ret;
if(sqlist == NULL)
{
printf("%s:%d :sqliist is NULL\n",__FUNCTION__,__LINE__);
return FAILED;
}
for(i = 0;i < sqlist->cur_len;i++)
{
if(sqlist->data[i] == data)
{
ret = sqlist_del_position(sqlist,i+1);
if(ret == FAILED)
{
printf("%s:%d :sqlist_del_position failed\n",__FUNCTION__,__LINE__);
return FAILED;
}
return SUCCESS;
}
}
return FAILED;
}
int sqlist_get_data_pos(sqlist_t *sqlist,int data)
{
int i;
if(sqlist == NULL)
{
printf("%s:%d :sqliist is NULL\n",FUNCTION,LINE);
return FAILED;
}
for(i = 0;i < sqlist->cur_len;i++)
{
if(sqlist->data[i] == data)
return i+1;
}
return FAILED;
}
int sqlist_get_pos_data(sqlist_t *sqlist,int pos)
{
if(sqlist == NULL)
{
printf("%s:%d :sqliist is NULL\n",FUNCTION,LINE);
return FAILED;
}
if(pos < 1 || pos > sqlist->cur_len)
{
printf("pos is invaild value\n");
return FAILED;
}
return sqlist->data[pos-1];
}
int sqlist_reserve(sqlist_t *sqlist)
{
int tmp_data;
int i;
if(sqlist == NULL)
{
printf("%s:%d :sqliist is NULL\n",__FUNCTION__,__LINE__);
return FAILED;
}
for(i = sqlist->cur_len;i > sqlist->cur_len / 2;i--)
{
tmp_data = sqlist->data[i -1];
sqlist->data[i -1] = sqlist->data[sqlist->cur_len - i];
sqlist->data[sqlist->cur_len - i] = tmp_data;
}
return SUCCESS;
}
int sqlist_merge(sqlist_t *new_sqlist,sqlist_t sqlist1,sqlist_t sqlist2)
{
int i;
if(new_sqlist == NULL)
{
printf("%s:%d :sqliist is NULL\n",FUNCTION,LINE);
return FAILED;
}
new_sqlist->cur_len = 0;
new_sqlist->size = sqlist1.cur_len + sqlist2.cur_len;
new_sqlist->data = (int *)malloc(sizeof(int) * new_sqlist->size);
if(new_sqlist->data == NULL)
{
printf("%s:%d :new_sqlist->data is NULL\n",__FUNCTION__,__LINE__);
return FAILED;
}
memset(new_sqlist->data,0,sizeof(int) * new_sqlist->size);
for(i = 0;i < sqlist1.cur_len;i++)
{
new_sqlist->data[i] = sqlist1.data[i];
new_sqlist->cur_len++;
}
for(i = 0;i < sqlist2.cur_len;i++)
{
new_sqlist->data[sqlist1.cur_len + i] = sqlist2.data[i];
new_sqlist->cur_len++;
}
return SUCCESS;
}
在这个main.C文件中: 包含两个头文件,一个主函数,注意,写主函数需要定义一个返回变量,再定义参数。
#include <stdio.h>
#include “sqlist.h”
int main()
{
int ret;
int i;
sqlist_t sqlist1;
sqlist_t sqlist2;
sqlist_t sqlist_new;
ret = sqlist_init(&sqlist1);
if(ret == FAILED)
{
printf("sqlist_init:%d failed \n",__LINE__);
return FAILED;
}
for(i = 0; i < 5;i++)
{
ret = sqlist_tail_add(&sqlist1,i);
if(ret == FAILED)
{
printf("sqlist_tail_add:%d failed \n",__LINE__);
return FAILED;
}
}
printf("============sqlist1============\n");
sqlist_display(sqlist1);
ret = sqlist_init(&sqlist2);
if(ret == FAILED)
{
printf("sqlist_init:%d failed \n",__LINE__);
return FAILED;
}
for(i = 5; i < 10;i++)
{
ret = sqlist_head_add(&sqlist2,i);
if(ret == FAILED)
{
printf("sqlist_head_add:%d failed \n",__LINE__);
return FAILED;
}
}
printf("============sqlist2============\n");
sqlist_display(sqlist2);