线性表:1)顺序表示 2)链式表示
线性表:
(1)有一个“第一个”数据元素
(2)有一个“最后一个”数据元素
(3)除第一个元素外 都只有一个前驱
(4)除最后一个元素外 都只有一个后继
顺序表某个位置删除一个元素,平均需要移动:(n-1)/2
n-1 n-2 ....0 (1/n)*[n*(n-1)/2]=(n-1)/2
顺序表插入一个元素,平均移动: n/2
n n-1....0 1/(n+1)*[(n+1)*n/2]=n/2
线性表的顺序表示:
#include<iostream>
using namespace std;
//顺序表的存储结构
#define MAXSIZE 100
typedef struct{
int *elem;
int length;
}sqList;
//初始化
int InitList(sqList &L) {
L.elem=new int[MAXSIZE];
L.length=0;
if(!L.elem) return 0;//申请空间失败
return 1;
}
//增
int InsertElem(sqList &L,int i,int e) {
if(i<1||i>L.length+1) return 0;//i是第几个位置
if(L.length==MAXSIZE) return 0;//表满
for(int j=L.length-1;j>=i-1;j--) {
L.elem[j+1]=L.elem[j];
}
L.elem[i-1]=e;
L.length++;
return 1;
}
//删除
int DeleteELem(sqList &L,int i) {//删除第i 个位置元素
if(i<1||i>L.length) return 0;
if(L.length==0) return 0;
for(int j=i-1;j<L.length;j++){
L.elem[j]=L.elem[j+1];
}
L.length--;
return 1;
}
//改
int ModifyElem(sqList &L,int i,int e) {
if(i<1||i>L.length) return 0;
L.elem[i-1]=e;
return 1;
}
//查
int GetElem(sqList L,int i,int &e){ //找第i个位置上的元素
if(i<1||i>L.length) return 0;
e=L.elem[i-1];
return 1;
}
void PrintList(sqList L){
for(int i=0;i<L.length;i++){
cout<<L.elem[i]<<" ";
}
}
main(){
sqList L;
InitList(L) ;//初始化
for(int i=1;i<=5;i++){//增
InsertElem(L,i,i);
}
PrintList(L);
cout<<endl;
DeleteELem(L,1);//删
PrintList(L);
cout<<endl;
ModifyElem(L,1,0);//改
PrintList(L);
cout<<endl;
int e;//查
GetElem(L,2,e) ;
cout<<e;
}
线性表的链式表示:
#include<iostream>
using namespace std;
typedef struct LNode{
int data;
LNode *next;
}LNode,*linkList;
//初始化
int InitList(linkList &L) {//带头结点的链表
L=new LNode;
L->next=NULL;
return 1;
}
//查 第i个位置上的
int GetElem(linkList L,int i,int &e) {
LNode *p=L->next;
int j=1;
while(p&&j<i){
p=p->next;
j++;
}
if(!p||j>i) return 0;
e=p->data;
return 1;
}
//查 元素值为e的
LNode *GetElem(linkList L,int e) {
LNode *p=L->next;
while(p->data!=e&&p){
p=p->next;
}
return p;
}
//插
int InsertELem(linkList &L,int i,int e) {//在第i个位置上插入e
if(i<1) return 0;
LNode *p=L;
int j=0;
while(j<i-1&&p) {
p=p->next;
j++;
}
if(!p||j>i-1) return 0;
LNode *s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}
//删除
int DeleteElem(linkList &L,int i) {
LNode *p=L,*q;
if(i<1) return 0;
int j=0;
while(p->next&&j<i-1){
p=p->next;
j++;
}
if(!p||j>i-1) return 0;
q=p->next;
p->next=q->next;
delete q;
return 1;
}
//前插法创建
void CreateList_H(linkList &L,int n) {//插入n个
LNode *p;
for(int i=0;i<n;i++) {
p=new LNode;
cin>>p->data;
p->next=L->next;
L->next=p;
}
}
//后插法创建
void CreateList_R(linkList &L,int n) {
LNode *r=L;
while(r->next){
r=r->next;
}
LNode *q;
for(int i=0;i<n;i++){
q=new LNode;
cin>>q->data;
q->next=NULL;
r->next=q;
r=q;
}
}
//遍历
void PrintList(linkList L){
LNode *p=L->next;
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
main(){
linkList L;
InitList(L);
CreateList_H(L,3);
PrintList(L);
CreateList_R(L,3);
PrintList(L);
InsertELem(L,1,8);
PrintList(L);
DeleteElem(L,1);
PrintList(L);
}
简单练习:
lx1
输入n值及n个整数,建立顺序表并遍历输出。
输入格式:
读入n及n个整数
输出格式:
输出n个整数,以空格分隔(最后一个数的后面没有空格)。
输入样例:
在这里给出一组输入。例如:
4
-3 10 20 78
输出样例:
在这里给出相应的输出。例如:
-3 10 20 78
#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef struct{
int *elem;
int length;
}sqList;
//初始化
int InitList(sqList &L) {
L.elem=new int[MAXSIZE] ;
L.length=0;
if(!L.elem) return 0;
return 1;
}
//创建
int CreatList(sqList &L,int i,int e) {
if(i<1||i>L.length+1) return 0;
L.elem[i-1]=e;
L.length++;
return 1;
}
//遍历
void PrintList(sqList L) {
for(int i=0;i<L.length;i++) {
cout<<L.elem[i]<<" ";
}
}
main(){
sqList L;
InitList(L);
int n,e;
cin>>n;
for(int i=0;i<n;i++){
cin>>e;
CreatList(L,i+1,e);
}
PrintList(L);
}
lx2
求链式线性表的倒数第K项
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
输入格式:
输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
输出格式:
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL
。
输入样例:
4 1 2 3 4 5 6 7 8 9 0 -1
输出样例:
7
#include<iostream>
using namespace std;
typedef struct LNode{
int data;
LNode *next,*before;
}LNode,*linkList;
//初始化
int InitList(linkList &L) {
L=new LNode;
L->next=NULL;
L->before=NULL;
if(!L) return 0;
return 1;
}
//尾插法
int CreatList(linkList &L,int e) {
LNode *r=L;
while(r->next){
r=r->next;
}
LNode *s=new LNode;
s->data=e;
s->next=NULL;
s->before=r;
r->next=s;
r=s;
return 1;
}
//遍历 用于测试
//void PrintList(linkList L) {
// LNode *p=L->next;
// while(p){
// cout<<p->data<<" ";
// p=p->next;
// }
//}
//查找
int GetElem(linkList L,int k) {
if(k<1) return 0;
LNode *r=L;
while(r->next){
r=r->next;
}
int j=1;
while(j<k&&r){
r=r->before;
j++;
}
if(r==L) return 0;
cout<<r->data;
return 1;
}
main(){
linkList L;
InitList(L);
int k;
cin>>k;
int e;
cin>>e;
while(e>=0){
CreatList(L,e);
cin>>e;
}
// PrintList(L);
GetElem(L,k);
}