顺序表操作:
(代码就不一次分析了)
以下为seqlist.h头文件
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#define FALSE -1
#define TRUE 0
#define INIT_SIZE 100
#define RISE 20
typedef int seqdata;
typedef struct _seqlist
{
seqdata *list;
seqdata len;
seqdata max_len;
}seqlist;
seqlist *Create_list();//创建表
int Againmalloc(seqlist *s);//大小不够的扩大
int Insert_pos(seqlist *s, int pos, seqdata data);//在pos位置插入数据
int Finddata(seqlist *s, seqdata data, seqdata *x);//找指定的值,返回下标
int Getdata(seqlist *s, int pos2, seqdata *x);//找下标的值
int Delete_pos (seqlist *s, int pos);//根据下标删除数据
int Delete_data(seqlist *s, seqdata data);//根据数据删除
int Reverse_list(seqlist *s);//逆序
seqlist *Merge_list(seqlist *s1, seqlist *s2);//合并表格
void Display (seqlist *s);//打印
void Destroy(seqlist *s);//释放
#endif
以下为seqlist.c函数
#include <stdio.h>
#include "seqlist.h"
#include <stdlib.h>
seqlist *Create_list()
{
seqlist *s = (seqlist *)malloc(sizeof (seqlist) / sizeof (char));
if (s == NULL)
{
return NULL;
}
s ->list = (seqdata *)malloc(sizeof (seqdata)/sizeof(char) * INIT_SIZE);
if (s ->list == NULL)
{
free(s);
return NULL;
}
s ->len = 0;
s ->max_len = INIT_SIZE;
return s;
}
int Againmalloc(seqlist *s)
{
if (s == NULL)
return FALSE;
int size = sizeof (seqdata) /sizeof (char) * (INIT_SIZE + RISE);
seqdata* tmp = (seqdata *)realloc(s ->list,size);
if (tmp == NULL)
return FALSE;
s ->list = tmp;
s ->max_len += RISE;
return TRUE;
}
int Insert_pos(seqlist *s, int pos, seqdata data)
{
if (s == NULL || pos < 0 || pos > s ->len)
return FALSE;
if (s ->len == s ->max_len)
{
if (Againmalloc (s) != TRUE)
return FALSE;
}
int i;
for (i = s ->len - 1; i >= pos; i--)
{
s ->list[i+1] = s ->list[i];
}
s ->list[pos] = data;
s ->len++;
return TRUE;
}
int Finddata(seqlist *s, seqdata data, seqdata *x)
{
if (s == NULL || x == NULL)
return FALSE;
int i;
int flag = 0;
for (i = 0; i < s ->len; i++)
{
if (s ->list[i] == data)
{
printf ("找到的下标为:");
flag = 1;
*x = i - 1;
break;
}
}
if (flag == 0)
printf ("未找到\n");
}
int Getdata(seqlist *s, int pos2, seqdata *x)
{
if (s == NULL || x ==NULL )
{
return FALSE;
}
if (pos2 < 0 || pos2 > s ->len)
{
printf ("输入错误\n");
}
printf ("数字为 :");
*x = s ->list[pos2];
return TRUE;
}
int Delete_pos (seqlist *s, int pos)
{
if (s == NULL || pos < 0 || pos > s ->len)
return FALSE;
int i;
for (i = pos + 1; i < s ->len - 1; i++)
s ->list[i] = s ->list[i+1];
return TRUE;
}
int Delete_data(seqlist *s, seqdata data)
{
if (s == NULL)
return FALSE;
int i;
int j;
int flag = 1;
for (i = 0; i < s ->len;i++)
{
if (s ->list[i] == data)
{
for (j = i; j < s ->len -1; j++)
{
s ->list[j] = s ->list[j+1];
flag = 0;
}
}
}
if (flag == 1)
printf ("没有这个数据\n");
return TRUE;
}
int Reverse_list(seqlist *s)
{
if (s == NULL)
return FALSE;
int i = 0;
int j = s ->len - 1;
while (i < j)
{
int tmp = s ->list[i];
s ->list[i++] = s ->list[j];
s ->list[j--] = tmp;
}
return TRUE;
}
seqlist *Merge_list(seqlist *s1, seqlist *s2)
{
if (s1 == NULL || s2 == NULL)
return NULL;
seqlist* s3= (seqlist *)malloc(sizeof (seqlist) / sizeof (char));
if (s3 == NULL)
return NULL;
int sizes3 = sizeof (seqdata) / sizeof (char) * (s1 ->len + s2 ->len);
s3 ->list = (seqdata *)malloc(sizes3);
s3 ->len = s1 ->len + s2 ->len;
s3 ->max_len = s1 ->len + s2 ->len;
int i = 0;
int j = 0;
int k = 0;
while (i < s1 ->len && j < s2 ->len)
{
if (s1 ->list[i] < s2 ->list[j])
s3 ->list[k++] = s1 ->list[i++];
else
s3 ->list[k++] = s2 ->list[j++];
}
while (i < s1 ->len )
{
s3 ->list[k++] = s1 ->list[i++];
}
while (j < s2 ->len )
{
s3 ->list[k++] = s2 ->list[j++];
}
return s3;
}
void Display (seqlist *s)
{
if (s == NULL)
return ;
int i;
for (i = 0; i < 21; i++)
{
if (i % 4 == 0 && i != 0)
printf ("\n");
printf ("%-8d",s ->list[i]);
}
printf ("\n");
}
void Destroy(seqlist *s)
{
if (s == NULL)
return;
// 先释放存储空间
free (s->list);
// 释放顺序表
free (s);
}
下面为main.c
#include <stdio.h>
#include "seqlist.h"
int main()
{
seqlist *s = Create_list();
if (s == NULL)
{
printf ("创建失败\n");
return FALSE;
}
printf ("创建成功\n");
int i1;
for (i1 = 1; i1 < 21; i1++)
{
Insert_pos(s, 0, i1);
}
Display (s);
int k1;
Finddata (s, 5, &k1);
printf ("%d\n",k1);
Display (s);
int k2;
Getdata (s, 5, &k2);
printf ("%d\n",k2);
Display (s);
Delete_data(s,75);
Display (s);
Delete_pos(s,5);
printf("删除后的数据为:\n");
Display (s);
Reverse_list(s);
printf ("逆序后的数据为:\n");
Display (s);
seqlist *s1 = Create_list();
if (s1 == NULL)
{
printf ("创建失败\n");
return FALSE;
}
seqlist *s2 = Create_list();
int i;
if (s2 == NULL)
{
printf ("创建失败\n");
return FALSE;
}
for (i = 20; i >= 0; i -= 2)
{
Insert_pos(s1,0, i);
}
for (i = 19; i >= 1; i -= 2)
{
Insert_pos(s2,0, i);
}
seqlist *s3 = Merge_list(s1, s2);
printf("合并数据过程如下:\n");
printf ("s1: \n");
Display(s1);
printf ("s2: \n");
Display(s2);
printf ("s3: \n");
Display(s3);
Destroy(s);
s = NULL;
printf ("销毁成功\n");
return TRUE;
}
通过以上代码,总结出以下几点注意:
(1)头文件,程序代码=与==的区别,逗号分好的使用,这些虽然都是一些很细节的地方,但是对于精密的计算机来说,程序是按照我们所写的儿执行的,有时候一个符号,可能导致整个程序的崩溃。所以加强代码 编写是必不可少的,对于写程序的过程中,也应时刻注意符号等等的书写。
(2)在堆上用malloc开辟空间的时候,必不可少的操作是检查空间是否开辟成功,医用要用if语句进行检查,对于使用完的空间应该用free函数进行释放,使用完的指针指向NULL,
(3)顺序表可以类比成一个数组,下标从0开始,对于数组的大部分操作对于顺序表也适用。
(4)程序错误
合并两个有序的表,这个错误错在当时Display函数的初始值为1.。。。。找了很长时间才找到。所以写代码一定要细心。
(5)对于程序中的bug,现阶段要自己找,自己看,这些都是自己写代码宝贵的财富,只有错过,才知道哪儿是对的。只要改了这些习惯,才能写出高质量的代码。
(6)模型,很多不懂得过程用笔画成模型,用模型参照解答,会很快。