(一)线性表、单向链表

来源:互联网 发布:java 跳出for循环 编辑:程序博客网 时间:2024/06/07 06:38
一、数据结构的学习方法
1、工具型
1》目的:
将现实生活中的各种复杂的数据,按照某一种方式分类,
按照这种分类将这些数据存储在计算机中,
然后,用各种编程语言(C语言)实现这些数据的处理。
2》学习内容:
1)数据的逻辑结构(数据之间的关系)
---》线性结构:线性表,栈,队列
---》非线性结构:树和图
2)数据的存储结构体
---》顺序存储
按照数据的逻辑关系,将每一个数据依次存储在一块连续的内存空间中。
---》链式存储
3)算法:
插入,删除,查找,排序,遍历等
3》学习的思路:
线性表----》存储-----》算法的实现
----》存储-----》算法的实现
队列 ----》存储-----》算法的实现
树和二叉树----》存储-----》算法的实现
查找 

排序:插入排序,交换排序等

二、线性表
1、特征:
1》数据特征:
对非空表,a0是表头,无前驱;an-1是表尾,无后继;其它的每个元素ai有且仅有一个直接前驱(ai-1)和一个直接后继(ai+1)。
2》数据操作
可以在任何位置插入和删除数据
2、顺序存储
通常把线性表的顺序存储方式简称为顺序表。
1》顺序存储结构体
#define MAXSIZE 10
typedef int datatype;
typedef struct seqlist{
datatype data[MAXSIZE];
int last;
}seq_lsit,*seq_plist;
2》算法的实现:
1)初始化:
----》申请顺序表的空间
----》将last置-1

2)插入:
----》移动数据
----》将数据插入到指定位置
----》last加1

3)删除:
----》移动数据
----》将指定位置的数据删除
----》last减1

// list.h#ifndef __LIST_H_#define __LIST_H_#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#define MAXSIZE 10typedef int datatype;typedef struct sqlist{datatype data[MAXSIZE];int last;}sq_list,*sq_qlist;extern void init_sqlist(sq_qlist *L);extern bool full_list(sq_qlist l);extern bool inster_list(sq_qlist l, int i, datatype data);extern bool empty_list(sq_qlist l);extern bool del_list(sq_qlist l, int i, datatype *p);extern bool show_list(sq_qlist l);#endif
// list.c#include "list.h"//创建void init_sqlist(sq_qlist *L){*L = (sq_qlist)malloc(sizeof(sq_list));if(NULL==(*L)){perror("malloc error!\n");exit(1);}(*L)->last = -1;}//插入前判断线性表是否已经满了bool full_list(sq_qlist l){if(l->last == MAXSIZE-1)return true;elsereturn false;}//插入输入的位置ibool inster_list(sq_qlist l, int i, datatype data){int j;//判断线性表是否已经满了if(full_list(l)){printf("线性表已经满了\n");return false;}//判断插入i位置是否合法if(i < 0 || i > l->last+1){printf("插入位置不合法\n");return false;}//满足以上两个条件则将data数据插入for(j = l->last; j >=i; j--)l->data[j+1] = l->data[j];l->data[i] = data;l->last++;return true;}//删除前判断线性表是否已经空的bool empty_list(sq_qlist l){if(l->last == -1)return true;elsereturn false;}//删除指定位置i的数据bool del_list(sq_qlist l, int i, datatype *p){int j;if(empty_list(l)){printf("线性表为空\n");return false;}//判断插入i位置是否合法if(i < 0 || i > l->last){printf("插入位置不合法\n");return false;}//删除指定位置的数据datafor(j = i; j < l->last; j++)l->data[j] = l->data[j+1]; *p = l->data[i];l->last--;return true;}//打印输出bool show_list(sq_qlist l){int j;for(j = 0; j <= l->last; j++)printf("%d\t",l->data[j]);printf("\n");return true;}
// test.h#ifndef __TEST_H__#define __TEST_H__#include "list.h"extern bool inster_test(sq_qlist l, datatype data);extern bool del_test(sq_qlist l, datatype data);#endif
// test.c#include "test.h"bool inster_test(sq_qlist l, datatype data){int i;for(i = 0; i <= l->last; i++)if(data < l->data[i])break;if(inster_list(l,i,data))return true;elsereturn false;}bool del_test(sq_qlist l, datatype data){int i;datatype t;for(i = 0; i <= l->last; i++)if(data == l->data[i])break;if(i > l->last){printf("要删除的数不在该数据中\n");return false;}if(del_list(l,i,&t))return true;elsereturn false;}
// main.c#include "list.h"#include "test.h"int main(void){sq_qlist l;datatype data;int ret;init_sqlist(&l);while(1){printf("请输入一个数据");ret = scanf("%d",&data);if(ret != 1){printf("Game over !\n");return 1;}else if(data > 0){inster_test(l,data);show_list(l);}else{del_test(l,-data);show_list(l);}}return 0;}
#MakefileCC = gccCFLAGS = -Wall -g -O0SRC = main.c list.c test.cOBJS = main$(OBJS):$(SRC)$(CC) $(CFLAGS) -o $@ $^clean:$(RM) $(OBJS) .*.sw?
//未完。。。






原创粉丝点击