目录
一、顺序表的创建和初始化
1. 数组法
typedef struct{
int elem[100]; //使用数组,直接定义了目前最大存储量和首地址,比指针法简单
int length;
}sqlist;
void initlist(sqlist L){
L.length=0;
}
2. 指针法
#define MAX 100; //最大存储量
#define LISTINCREMENT 10; //增加存储量个数
typedef struct{
int *elem;
int length;
int listsize;
}sqlist;
sqlist initlist(sqlist L){
int listsize=100;
L.elem = (int *)malloc(sizeof(int)*listsize);
L.length = 0;
return L;
}
注意:
malloc函数 :(int *)表示强制类型转化为所需的指针类型 ;
malloc括号内:所需要的空间大小,listsize为空间个数,sizeof(int)为一个int类型所需的空间大小,相乘即为顺序表开辟的空间大小;
二、顺序表元素的查找
1.(快速查找)思路:将需要查找的元素放在顺序表下标零号位置上,然后从右往左找,若找到,返回下标值,找不到,返回0;省去了判断i是否在【0,L.length】范围内的时间
int locate(sqlist L,int e){
L.ele[0]=e;
for(i=L.length;L.elem[i]!=e;i--); //一次判断,减少时间复杂度
return i;
}
2. 原方法(双重判断,浪费时间)
int locate (sqlist L,int e){
for(i=1;i<=L.length;i++){
if(e==L.elem[i]) return i; //找到返回下标
}
return -1; //找不到返回-1
}
三、顺序表元素的插入
1.数组
void insert(sqlist L,int i,int e){
if(i<1||i>L.length+1) return;
for(j=L.length;j>=i;j--){
L.elem[j+1]=L.elem[j];
}
L.elem[i]=e;
L.length++;
}
2. 指针
realloc函数
语法
原型:extern void *realloc(void mem_address, unsigned int newsize);
指针名=(数据类型)realloc(要改变内存大小的指针名,新的大小)
void insert(sqlist L, int i, int e){
/*int *newbase;
if(i<1||i>L.length+1) return;
if(L.length+1>L.listsize)
newbase = (int *)realloc((L.elem,L.listsize+LISTINCREMENT)*sizeof(int));
//存储空间已满,分配空间
if(!newbase) return; //分配失败
L.elem = newbase;
L.length+=LISTINCREMENT;*/ 有错误
int *p,*q;
q=&(L.elem[i]); //q为插入位置
for(p=&(L.elem[L.length]);p>=q;p--){
*(p+1)=*p;
}
*q=e;
L.length++;
}
四、顺序表元素的删除
1. 数组(错误)
void dele(sqlist l,int i){
int j;
for(j=i;j<=l.length-1;j++)
l.elem[j]=l.elem[j+1];
l.length--;
}
2.指针(有错误)
void dele(sqlist l,int i){
int *p,*q;
p=&(l.elem[i]);
int e=*p;
q=&(l.elem[l.length-1]);
for(;p<=q;p++){
*p=*(p+1);
}
l.length--; //length长度不变
}
代码练习(自存)
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define MAX 100 //最大存储量
#define LISTINCREMENT 10 //增加存储量个数
typedef struct{
int *elem;
int length;
int listsize;
}sqlist;
sqlist initlist(sqlist L){
int listsize=100;
L.elem = (int *)malloc(sizeof(int)*listsize);
L.length = 0;
return L;
}
/*typedef struct{
int elem[100];
int length;
}sqlist;
void initlist(sqlist L){
L.length=0;
}
int locate(sqlist L,int e){
L.ele[0]=e;
for(i=L.length;L.ele[i]!=e;i--); //一次判断,减少时间复杂度
return i;
}
int locate (sqlist L,int e){
for(i=1;i<=L.length;i++){
if(e==L.ele[i]) return i; //找到返回下标
}
return -1; //找不到返回-1
}
*/
/*void insert(sqlist L,int i,int e){
if(i<1||i>L.length+1) return;
for(j=L.length;j>=i;j--){
L.elem[j+1]=L.elem[j];
}
L.elem[i]=e;
L.length++;
}*/
void insert(sqlist L, int i, int e){
/*int *newbase;
if(i<1||i>L.length+1) return;
if(L.length+1>L.listsize)
newbase = (int *)realloc((L.elem,L.listsize+LISTINCREMENT)*sizeof(int));
//存储空间已满,分配空间
if(!newbase) return; //分配失败
L.elem = newbase;
L.length+=LISTINCREMENT;*/
int *p,*q;
q=&(L.elem[i]); //q为插入位置
for(p=&(L.elem[L.length]);p>=q;p--){
*(p+1)=*p;
}
*q=e;
L.length++;
}
int main(){
sqlist l;
int n=10,i;
l=initlist(l);
for(i=1;i<=n;i++){
l.elem[i]=i;
}
insert(l,3,66);
for(i=1;i<=n;i++)
printf("%d ",l.elem[i]);
return 0;
}
1 2 66 4 5 6 7 8 9 10
Process returned 0 (0x0) execution time : 0.010 s
Press any key to continue.