目录
小tips:起名时:见名知意
第一章 基础知识
- 数据元素是数据的基本单位
- 数据项是数据的最小单位
- 数据结构是带有结构的各项数据元素的集合
数据的物理结构又称储存结构:顺序储存,链式储存
实验题目
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef float ElemType;
typedef ElemType *Triplet; // 声明Triplet为ElemType指针类型
// 三元组的初始化
Status initTriplet(Triplet &T, ElemType v0, ElemType v1, ElemType v2)
{
T = (Triplet) malloc(sizeof(ElemType) * 3 ); // 第一空
if (!T) // 第二空
{
printf("分配内存失败!");
exit(OVERFLOW);
}
T[0] = v0;
T[1] = v1;
T[2] = v2;
return OK;
}
// 释放内存,退出系统, 注意:动态分配内存需要及时释放内存空间
void destroyTriplet(Triplet &T)
{
free(T); // 第三空
printf("分配内存已释放!");
exit(0);
}
// 用e获取T的第i(1~3)个元素的值,
Status getElem(Triplet T, int i, ElemType &e) //数据类型是ElemType,指针T是Triplet
{
if (i < 1 || i > 3)
return ERROR;
else
e=T[i-1]; // 第四空 看主函数部分输出的是e,所在位置下标和数组一样从0开始,所以i-1
return OK;
}
// 置T的第i元的值为e
Status putElem(Triplet &T, int i, ElemType e)
{
if (i < 1 || i > 3)
return ERROR;
else
T[i-1]=e ; // 第五空 这里是要把T[i-1]这个位置的所存储的东西换成e
return OK;
}
int main()
{
Triplet T;
Status flag;
ElemType v0, v1, v2, e;
printf("请进入三元组的三个值v0,v1,v2:\n");
scanf("%f%f%f", &v0, &v1, &v2);
// 初始化三元组
initTriplet(T, v0, v1, v2);
printf("调用初始化函数后,T的三个值为:%.1f,%.1f,%.1f\n", T[0], T[1], T[2]);
// 请调用函数获得T的第2元的值
getElem( T, 2 , e) ; // 第6空
printf("三元组第2元的值为:%.1f\n", e);
// 请调用函数修改T的第2元的值为56.7
putElem(T, 2 , 56.7 ); // 第7空
// 再次输出T的第2元的值
printf("三元组第2元的值改成了:%.1f\n", T[1]);
destroyTriplet(T);
return 0;
}
第二章 线性表
- 除了第一个元素没有直接的前驱和最后一个元素没有直接的后继之外,其余的每个数据元素只有一个直接的前驱和一个直接的后继
- 线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素。
- 只要知道起始位置可以随便查其中的每个数据
#define LIST_INIT_SIZE 100
#define LISTINCREAMENT 10
typedef struct
{
ElemType *elem; /* 指向线性表占用的数组空间。*/
int length; /*线性表的长度*/
int listsize; /*当前分配的存储容量(以sizeof(ElemType)为单位) /*
} SqList;
- 顺序表很容易实现访问操作,可随机存取元素,但插入和删除操作主要是移动元素。
-
#include<stdio.h> #include<stdlib.h> typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList; void creat_list(LinkList &L,int); //创建链表 void insert_list(LinkList &L,int,int ); //插入数据 void print_list(LinkList &L);//显示数据 //尾插法创建单链表 void creat_list(LinkList &L,int n) { LinkList p,q; //创建头结点 L=(LinkList)malloc(sizeof(LNode)); L->next = NULL; //1 int i; p=L; for(i=1;i<=n;i++) { q=(LinkList)malloc(sizeof(LNode)); printf("data:"); scanf("%d",&p->data); //2 q->next=NULL; p->next=q; //3 p =q; } } //插入新数据 void insert_list(LinkList &L,int x,int i ) { int j=0; LinkList p,s; p=L; while((p!=NULL)&&(j<i-1)) { p=p->next; //4 j++; } if(p==NULL|| j >i-1) { printf("插入点位置错误!\n"); exit(0); } s=(LinkList)malloc(sizeof(LNode)); s->data=x; //5 s->next=p->next; p=L->next; //6 print_list(L); } //显示数据值 void print_list(LinkList &L) { LinkList p; p=L->next; //7 while(p!=NULL) { printf("%d,",p->data); p=p->next; //8 } } main() { LinkList L,p; int n; int x,i; printf("输入链表的结点个数 n="); scanf("%d",&n); creat_list(L,n); //创建n个结点的单链表 9 printf("\n*****************************************************\n"); printf("输入要插入的元素值 x="); scanf("%d",&x); printf("\n输入要插入的位置 i="); scanf("%d",&i); insert_list(L,x,i); //向链表的第i个元素前插入数据x 10 system("pause"); }