数据元素都是记录; 元素间关系是线性 线性结构可表示为:(a1 , a2 , ……, an) 线性结构的特点: ① 表中元素属于同一种数据对象。ai∈ElemSet ② 只有一个首结点和尾结点; ③ 除首尾结点外,其他结点只有一个直接前驱和一个直接后继。序偶关系〈ai , ai+1〉 简言之,线性结构反映元素间的逻辑关系是 一对一 数据结构常用二元组定义方式: Linear List = ( D , R ) 其中: D = { ai | ai∈ ElemSet, i=1,2,…,n, n≥0 },称元素的集合 R = { <ai, ai+1 > | ai , ai+1∈D, i=1,2,…,n-1},称关系的集合 常用基本操作: (1)计算线性表的长度n; (2)取线性表中第 i 个元素,1≤i≤n; (3)插入一个元素到第 i 项(1≤ i ≤n+1),线性表长度加1; (4)删除第 i 项元素(1≤ i ≤n),线性表长度减1; (5)遍历线性表,即顺序读取表中个元素; (6)修改第 i 项的值(1≤ i ≤n); (7)查找元素 x ; (8)排序; ……
二、线性表的存储结构
(一)静态数据结构(顺序存储)
用一整片地址连续的存储单元依次存储线性表的各个数据元素。又称为顺序存储结构或顺序映像。 线性表中逻辑上相邻的元素 ai 和 ai+1 的存储位置LOC(ai)和LOC(ai+1)也是相邻(连)的。即: LOC( ai+1 ) = LOC( ai ) + m LOC( ai) = LOC( a1 )+( i-1 ) * m 整个线性表的所占空间为:n * m ★python可以使用列表(list)实现。 Python代码:
A= [[1,3,5],[7,9,11],[13,15,17]] #二维数组的声明 B= [[9,8,7],[6,5,4],[3,2,1]] #二维数组的声明 N=3 C=[[None] * N for row in range(N)] #声明一个3*3的二维数组 for i in range(3): for j in range(3): C[i][j]=A[i][j]+B[i][j] #矩阵C = 矩阵A + 矩阵B print('[矩阵A和矩阵B相加的结果]’) #打印出A+B的内容 for i in range(3): for j in range(3): print('%d' %C[i][j], end='\t') print()
print("【请输入A维数(M,N)】") M = int(input("M=")) N = int(input("N=")) if M<=0or N<=0: print("错误:维数M,N必须大于0") return A = [None]*M*N print("【请输入A中各个元素】") for i in range(M): for j in range(N): A[i*N+j] = input("a{}{}=".format(i+1,j+1)) print("【请输入B维数(N,P)】") N = int(input("N=")) P = int(input("P=")) if N<=0or P<=0: print("错误:维数M,N必须大于0") return B = [None]*N*P print("【请输入B中各个元素】") for i in range(N): for j in range(P): B[i*P+j] = input("a{}{}=".format(i+1,j+1)) C = [None]*M*P #开始相乘 for i in range(M): for j in range(P): Temp = 0 for k in range(N): Temp = Temp + int(A[i*N+k])*int(B[k*P+j]) C[i*P+j] = Temp print("[A*B的结果是]") for i in range(M): for j in range(P): print("{}".format(C[i*P+j]),end='\t') print()
N = int(input("请输入方阵阶数(N):")) if N<=0: print("错误:阶数N必须大于0") return A = [[None]*N for row in range(N)] B = [[None]*N for row in range(N)] print("【请输入A中的各个元素】") for i in range(N): for j in range(N): A[i][j] = eval(input("a{}{}=".format(i+1,j+1))) print("【原设置的矩阵内容】") for i in range(N): for j in range(N): print("{}".format(A[i][j]),end='\t') print() #进行转置 for i in range(N): for j in range(N): B[i][j] = A[j][i] print("【转置矩阵内容为】") for i in range(N): for j in range(N): print("{}".format(B[i][j]),end='\t') print()
A = [[7,8,12,21,9], [0,5,14,17,6], [0,0,7,23,24], [0,0,0,32,19], [0,0,0,0,8]] N = 5
num = int(N*(1+N)/2) B = [None]*(num)
defgetMValue(i,j): index = int(i*(2*N-i+1)/2+j-i) return B[index] print('='*40) print("右上三角矩阵") for i in range(N): for j in range(N): print('%d'%A[i][j],end='\t') print()
index = 0 for i in range(N): for j in range(N): if(A[i][j]!=0): B[index]=A[i][j] index += 1 print("="*40) print("以一维数组的方式显示") print("[",end='') for i in range(N): for j in range(i,N): print(' %d'%getMValue(i,j),end='') print(" ]")
A = [[76,0,0,0,0], [54,51,0,0,0], [23,8,26,0,0], [43,35,28,18,0], [12,9,14,35,46]] N = 5 num = int(N*(1+N)/2) B = [None]*(num)
defgetMValue(i,j): index = int(i*(i+1)/2+j) return B[index]
print('='*40) print("左下三角矩阵") for i in range(N): for j in range(N): print('%d'%A[i][j],end='\t') print()
index = 0 for i in range(N): for j in range(N): if(A[i][j]!=0): B[index]=A[i][j] index += 1 print("="*40) print("以一维数组的方式显示") print("[",end='') for i in range(N): for j in range(0,i+1): print(' %d'%getMValue(i,j),end='') print(" ]")
A = [[0,0,0,0,8], [0,0,0,32,19], [0,0,7,23,24], [0,5,14,17,6], [7,8,12,21,9]] N = 5
num = int(N*(1+N)/2) B = [None]*(num)
defgetMValue(i,j): index = int((i+2)*(i+1)/2+j-N) return B[index] print('='*40) print("右下三角矩阵") for i in range(N): for j in range(N): print('%d'%A[i][j],end='\t') print()
index = 0 for i in range(N): for j in range(N): if(A[i][j]!=0): B[index]=A[i][j] index += 1 print("="*40) print("以一维数组的方式显示") print("[",end='') for i in range(N): for j in range(N-i-1,N): print(' %d'%getMValue(i,j),end='') print(" ]")