顺序表和单链表
顺序表和单链表
顺序表基本运算
思想要体会并理解和使用
- 顺序表中,用数组存放,数据元素
- 明确数据元素的序号和数组的下标的关系
- 序号 = 下标 + 1
- 要习惯,并运用 数据元素 这个说法
初始化线性表
把 L 置为空表
L->length = 0;
往线性表L中添加元素
**1. **判满
**2. **添加元素
**3. **填充数据元素
**4. **长度+1
**5. **是否继续添加
**1. **判满
if (L->length == MaxLen)
{
printf("顺序表已满!\n");
return;
}
**2. **添加元素
printf("请输入数据元素的值:");
scanf("%d", &x);
**3. **填充数据元素
L->data[L->length] = x;
**4. **顺序表长度+1
L->length++;
**5. **是否继续添加
printf("是否继续添加?(Y/N)");
scanf("%c", &ch);
在顺序表中,数据元素的序号和数组的下标的关系
序号 = 下标 + 1
最后一个元素,就是第 length 个元素,它的下标是 length-1
接着往后添加,这个数据元素的下标就是 L->length
输出线性表L中的元素
for (i = 0; i < L.length; i++)
printf("(%d)%d", i + 1, L.data[i]);
求线性表L的长度
return L.length;
按序号取元素
**1. **判断查找位置是否合法
**2. **返回数据元素
按值查找
插入新元素
**1. **判满
**2. **判断查找位置是否合法
**3. **后移
**4. **填充数据元素
**5. **长度+1
在线性表中删除元素Delete(&L, i)
**1. **判断删除位置是否合法
**2. **前移
**3. **长度-1
顺序表综合练习
单链表基本运算
初始化线性表
**1. **为头结点申请空间,并判断申请空间是否成功
**2. **将头指针置空
往线性表L中添加元素
头插法
添加的元素,放在头结点之后
**1. **申请空间,并判断申请空间是否成功
**2. **添加元素
**3. **填充数据域,指针域
**4. **连接其前驱结点
**1. **申请空间,并判断申请空间是否成功
// 申请空间LinkList s = (LinkList)malloc(sizeof(ListNode));// 判断空间是否申请成功if (s == NULL){ printf("空间申请失败!\n"); exit(-1);}
**2. **添加元素
DataType x;printf("请输入要添加的数据元素的值:");scanf("%d",&x);
**3. **填充数据域,指针域
s->data = x;s->next = L->next;
**4. **连接其前驱结点
把头结点的前驱结点和新添加的结点连接
头插法,连接在头结点之后
尾插法
**1. **找到尾结点
**2. **添加元素
**3. **申请空间,并判断申请空间是否成功
**4. **填充数据域、指针域
**5. **连接其前驱结点
**6. **r指向新的尾结点
添加的元素放在尾结点之后
注意事项
有的程序里,初始化和头插法或尾插法,放在一个函数里
对于初始化和尾插法,放在一起的情况下,头结点,就是尾结点
就不需要下面这些代码了
while (r->next){ r = r->next;}
输出线性表L的元素
**1. **定义第1个元素
**2. **while循环逐个输出
求线性表L的长度
**1. **定义第一个元素
**2. **while循环计数
按序号取元素
**1. **判断查找位置是否合法
**2. **定义第1个元素
**3. **while循环
按值查找
插入新元素
**1. **判断插入位置是否合法
**2. **找到 q 结点
**3. **申请空间,并判断申请空间是否成功
**4. **填充数据域,填充指针域
**5. **连接其前驱结点
在线性表中删除元素
**1. **判断删除位置是否合法
**2. **找到 q 结点(第 i-1 个元素)
**3. **修改指针域
链表画图,理解
有个想法,dev-c++中的样式可不可以有深色的颜色背景,怎么设置
单链表综合练习
学生信息管理系统
增、删、改、查、显
添加元素AddList()
这里使用了尾插法
void AddList(LinkList L);
**1. **申请空间,判断申请空间是否成功
**2. **添加元素
**3. **填充数据域,指针域
**4. **连接其前驱结点
**5. **是否继续添加
删除元素DeleteList()
void DeleteList(LinkList L, LinkList p);
插入元素InsertList()
void InsertList(LinkList L, int i, DataType x);
**1. **判断插入位置是否合法
**2. **找到插入位置,第 i - 1 个位置
**3. **申请空间,判断申请空间是否成功
**4. **填充数据域,指针域
**5. **连接其前驱结点
查询
按学号查找SearchNum()
LinkList SearchNum(LinkList L, char* s);
按成绩范围查找SearchScore()
int SearchScore(LinkList L, int low, int high);
显示PrintList()
void PrintList(LinkList L);
排序
按学号升序排(冒泡法)SortNum()
void SortNum(LinkList L);
按成绩升序排SortScore
void SortScore(LinkList L);
计数Count()
void Count(LinkList L);
退出系统Quit()
辅助
辅助1.1–输入数据InputData()
void InputData(LinkList L, DataType* x);
辅助1.2–输出数据OutputData()
void OutputData(DataType x);
辅助2–获取链表长度GetLength()
int GetLength(LinkList L);
其他
初始化单链表InitList()
**1. **申请空间,判断申请空间是否成功
选单显示menu()
void menu(){ printf("****************************************************\n"); printf(" 学生信息管理系统 \n"); printf("******************************************************\n"); printf(" 1.添加 2.查询 \n\n"); printf(" 3.显示 4.插入 \n\n"); printf(" 5.删除 6.排序 \n\n"); printf(" 7.统计 0.退出系统 \n\n"); printf("-------------------------------------------------------------");}