赞
踩
InitList(&L):初始化表。构造一个空的线性表。
用静态数组定义顺序表。由于数组的大小和空间已固定,一旦空间占满,再加入新的数据就会产生溢出。
- // 顺序表定义——静态分配
- #include <stdio.h>
-
- #define MaxSize 10 // 定义最大长度
-
- typedef struct {
- int data[MaxSize]; // 数组存储线性表
- int length; // 定义表长
- }SqList;
-
- // 初始化,初始值为0
- void InitList(SqList *L) {
- int i;
- for(i=0; i<MaxSize; i++) {
- L->data[i] = 0;
- }
- L->length = 0;
- }
-
- int main() {
- SqList L;
- InitList(&L);
- int i;
- for(i=0; i<MaxSize; i++) {
- printf("%d,",L.data[i]);
- }
- return 0;
- }
补充:
1、C语言关于结构体做参数传递:
https://blog.csdn.net/lin37985/article/details/38582027
用&L做实参,&L是结构体变量L的地址。在调用函数时将该地址传送给形参L(L是指针变量)。这样L就指向实参。
值传递:这种方式使用变量、常量、数组元素作为函数参数,实际是将实参的值复制到形参相应的存储单元中,即形参和实参分别占用不同的存储单元。
地址传递:这种方式使用数组名或者指针作为函数参数,传递的是该数组的首地址或指针的值,而形参接收到的是地址,即指向实参的存储单元,形参和实参占用相同的存储单元,这种传递方式称为“参数的地址传递”。
准确定义:
int *p; p = &x; 或
int *p = &x;
*p代表x地址处具体存放的数据;p代表x的地址值;&x代表x的地址值;x代表x地址处具体存放的数据。
看调用者的类型,如果调用者是指针,就在它后边用 ->;如果它不是地址,就在它后边就用 .
基本操作
InitList(&L):初始化表。构造一个空的线性表。
采用动态分配内存的方式定义顺序表。
存储数组的空间是在程序执行过程中通过动态存储分配语句分配的,一旦数据空间占满,就另外开辟一块更大的存储空间,用来替换原来的存储空间,从而达到扩充存储数组空间的目的。原来的数据整体复制到新数组内。
- // 顺序表定义——动态分配
- #include<stdio.h>
- #include<malloc.h>
-
- #define InitSize 10 // 定义初始长度
-
- typedef struct {
- int *data; //数据头指针
- int MaxSize; //数据最大容量
- int length; //数组长度
- }SqList;
-
- void InitList(SqList *L) {
- L->data = (int*)malloc(InitSize * sizeof(int)); // 动态分配内存
- L->MaxSize = InitSize;
- int i;
- for(i=0; i<L->MaxSize; i++)
- L->data[i] = 0; // 设置默认值
- L->length = 0;
- }
-
- void IncreaseSize(SqList *L) {
- int *p = L->data;
- L->data = (int*)malloc((L->MaxSize+InitSize)*sizeof(int));
- int i;
- for(i=0; i<L->length; i++) {
- L->data[i] = p[i];
- }
- L->MaxSize = L->MaxSize + InitSize;
- for(i=L->length; i<L->MaxSize; i++) {
- L->data[i] = 0;
- }
- free(p);
- }
-
- int main() {
- SqList L;
- InitList(&L); // 初始化数组
- // 赋值0-9
- int i;
- for(i=0; i<L.MaxSize; i++) {
- L.data[i] = i;
- L.length++;
- }
- for(i=0; i<L.MaxSize; i++) {
- printf("%d,", L.data[i]);
- }
- printf("\n");
- if(L.length == L.MaxSize)
- IncreaseSize(&L);
- for(i=0; i<L.MaxSize; i++) {
- printf("%d,", L.data[i]);
- }
- return 0;
- }
基本操作:
ListInsert(&L, i ,e):在顺序表的第i个位置插入e
-
- //插入元素 ListInsert(&L, i ,e)
-
- #include<stdio.h>
- #include <stdbool.h>
- #define MaxSize 10
-
- typedef struct {
- int data[MaxSize]; //静态类型定义结构体
- int length;
- }SqList;
-
- //初始化顺序表
- void InitList(SqList *L) {
- for(int i=0; i<MaxSize; i++)
- L->data[i] = 0; //表内元素初始化为0
- L->length = 0;
- }
-
- bool ListInsert(SqList *L, int i, int e) { //在第i个位置插入e
- if(L->length >= MaxSize) { //合法性验证
- printf("顺序表已满");
- return false;
- }
- if(i<1 || i>L->length+1) {
- printf("输入不合法");
- return false;
- }
-
- for(int j=L->length; j>=i; j--) //定位
- L->data[j] = L->data[j-1]; //后移
- L->data[i-1] = e; //插入
- L->length++;
- return true;
- }
-
- int main() {
- SqList L;
- InitList(&L); //初始化数组
- for(int i=0; i<8; i++) { //给数组赋值【1-9】
- L.data[i]=(i+1);
- L.length++;
- }
- for(int i=0; i<L.length; i++) //查看插入前的顺序表
- printf("%d ",L.data[i]);
- printf("\n");
- bool result = ListInsert(&L, 4, 14); //在第4个位序插入14
- for(int i=0; i<L.length; i++)
- printf("%d ",L.data[i]);
- return 0;
- }
基本操作:
ListDelete(&L,i,&e):删除第i个元素,并取回删除的值
- //顺序表删除 ListDelete(&L,i,&e)
-
- #define MaxSize 10
- #include<stdio.h>
- #include <stdbool.h>
-
- typedef struct { //定义数组结构体
- int data[MaxSize];
- int length;
- }SqList;
-
- //初始化顺序表
- void InitList(SqList *L) {
- for(int i=0; i<MaxSize; i++) //数组内元素置为0
- L->data[i] = 0;
- L->length = 0;
- }
-
- //顺序表删除
- bool ListDelete(SqList *L, int i, int *e) { //删除第i个元素,并取回删除的值
- if(i<1||i>L->length)
- return false;
- *e = L->data[i-1]; //查找
- for(int j=i; j<L->length; j++) //移位
- L->data[j-1] = L->data[j];
- L->length--;
- return true;
- }
-
- int main() {
- SqList L;
- InitList(&L); //初始化顺序表
- for(int i=0; i<8; i++) { //将顺序表赋值为【1-8】
- L.data[i]=(i+1);
- L.length++;
- }
- int e = -1;
- if(ListDelete(&L, 3, &e)) //删除顺序表第3位元素,并返回该元素的值
- printf("已删除元素%d ", e);
- else
- printf("删除失败!");
- return 0;
- }
基本操作:
GetElem(&L,i):查找第i位元素的值,并获取该值
- //按位查找 GetElem(L,i)
-
- #define MaxSize 10
- #include<stdio.h>
-
- typedef struct { //结构体数组定义顺序表
- int data[MaxSize];
- int length;
- }SqList;
-
- //初始化顺序表
- void InitList(SqList *L) { //将顺序表初始化为0
- for(int i=0; i<MaxSize; i++)
- L->data[i] = 0;
- L->length = 0;
- }
-
- //函数的默认返回值就是int型
- int GetElem(SqList *L, int i) { //查找第i位元素
- return L->data[i-1]; //返回第i位元素的值
- }
-
- int main() {
- SqList L;
- InitList(&L);
- for(int i=0; i<8; i++) { //顺序表赋值位【0-7】
- L.data[i] = i;
- L.length++;
- }
- int e = GetElem(&L, 4); //查找第4位元素的值
- printf("%d",e);
- }
基本操作:
LocateElem(&L, e):在顺序表中查找第一个值为e的元素,并返回其位序
- //顺序表按值查找
-
- # define MaxSize 10
- #include<stdio.h>
-
- typedef struct{ //结构体定义顺序表
- int data[MaxSize]; //数组
- int length;
- }SqList;
-
- //初始化顺序表
- void InitList(SqList *L) { //将顺序表置为0
- for(int i=0; i<MaxSize; i++) {
- L->data[i] = 0;
- }
- L->length = 0;
- }
-
- //在顺序表中查找第一个值为e的元素,并返回其位序
- int LocateElem(SqList *L, int e) {
- for(int i=0; i<L->length; i++)
- if(L->data[i] == e)
- return i+1;
- }
-
- int main() {
- SqList L;
- InitList(&L);
- for(int i=0; i<8; i++) { //给顺序表赋值【8-1】
- L.data[i] = 8-i;
- L.length++;
- }
- int Elem = 3;
- int d = LocateElem(&L, Elem);
- printf("%d", d);
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。