系列文章目录
第一章 线性表
一、线性表?
线性表是具有相同数据类型额n(n>=0)个数据的有限序列,其中n为表长,当n==0时线性表为空。除第一个元素外都有唯一的前驱,除最后一个元素外都有唯一的后继
1.顺序表及其基本操作
代码如下:
#include<stdio.h>
#include<iostream>
using namespace std;
#define MaxSize 10
//定义线性表
typedef struct{
//线性表结构
int data[MaxSize];
// 线性表的长度
int length;
}SqList;
// 初始化线性表
void InitList(SqList &L){
L.length=0;
}
// 求表长
int Length(SqList L){
return L.length;
}
//按元素查找,找到返回其位置 第一个索引为0
int LocateElem(SqList L,int e){
for(int i=0;i<L.length;i++){
//找到
if(L.data[i]==e){
return i+1;
}
}
// 未找到
return -1;
}
// 根据元素位置找元素 默认位置从1开始
int GetElem(SqList L,int i){
// 判断下标是否越界
if(L.length<i||i<1){
printf("请输入正确的下标值!\n");
return -1;
}
// 未越界
return L.data[i-1];
}
// 判断顺序表为空
bool Empty(SqList L){
if(L.length<=0){
return true;
}
return false;
}
//在i的位置插入元素e
bool ListInsert(SqList &L,int i, int e){
int j;
if(i<1||i>MaxSize){
return false;
}
for(j=L.length;j>=i;j--){
L.data[j]=L.data[j-1];
}
L.data[i-1]=e;
L.length++;
return true;
}
// 根据元素删除 删除成功返回true
bool ListDelete(SqList &L,int e){
if(Empty(L)){
return false;
}
for(int i=0;i<L.length;i++){
// 找到元素位置
if(L.data[i]==e){
//将所在位置之后的元素向前移动
for(int j=i;j<L.length;j++){
L.data[j]=L.data[j+1];
}
L.length--;
return true;
}
}
//未找到
return false;
}
// 显示列表元素
void ListShow(SqList L){
int i=0;
for(i;i<L.length;i++){
printf("%d ",L.data[i]);
}
printf("\n");
}
int main(){
//定义顺序表
SqList L;
//初始化
InitList(L);
//插入元素
ListInsert(L,1,5);
ListInsert(L,2,4);
ListInsert(L,3,3);
ListInsert(L,2,2);
// 显示
ListShow(L);
// 删除
ListDelete(L,2);
ListShow(L);
int index =LocateElem(L,2);
printf("是第%d个元素\n",index);
index =GetElem(L,3);
printf("是第%d个元素\n",index);
if(!Empty(L)){
printf("顺序表不为空!\n");
}
system("pause");
return 0;
}
2.链表及其基本操作
代码如下:
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
// 链表的定义
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkNode;
//求链表的长度
int LinkLength(LinkNode L){
//初始化为-1 带头结点
int count=-1;
LNode *p=L;
while(p!=NULL){
p=p->next;
count++;
}
return count;
}
// 显示列表元素
void disPlay(LinkNode L){
LNode *p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
}
// 头插法建立带头结点的单链表
LinkNode InsertHead(LinkNode &L){
int x;
// 接受数据 可用cin>>x;
scanf("%d",&x);
//当输入9999表示输入完成
while(x!=9999){
// 先动态申请一块空间s,并赋值
LNode *s =(LNode *)malloc(sizeof(LNode));
s->data=x;
// L为头结点 让s的next指向第一个结点
s->next=L->next;
// 更新头结点
L->next=s;
scanf("%d",&x);
}
return L;
}
//查找带头结点的第i个结点
LNode * GetNodeByIndex(LinkNode L,int i){
// 判断i的合法性
if(i<=0){
return NULL;
}
int j=0;
LNode *p=L;
while(p!=NULL&&j<i){
p=p->next;
j++;
}
return p;
}
//按值查找结点
LNode * GetNodeByValue(LinkNode L,int e){
LNode *p=L;
while(p!=NULL){
if(p->data==e){
return p;
}
// 向下查找
p=p->next;
}
return NULL;
}
//尾插法建链表
LinkNode InsertTail(LinkNode &L){
LNode *p=L;
// 先找到最后一个结点p
while(p->next!=NULL){
p=p->next;
}
int x;
scanf("%d",&x);
while(x!=9999){
// 构建新结点
LNode *s =(LNode *)malloc(sizeof(LNode));
if(s==NULL){
return NULL;
}
s->data=x;
// 连接新结点
p->next=s;
p=s;
scanf("%d",&x);
}
//将最后一个插入的结点的next指向NULL
p->next=NULL;
return L;
}
//删除带头结点的第i结点
LinkNode deleteNode(LinkNode &L,int i){
// 判断i的合法性
if(i<1){
return L;
}
//找到第i-1个结点
LNode *p=GetNodeByIndex(L,i-1);
LNode *q;
q=p->next;
p->next=q->next;
//释放q结点的空间
free(q);
return L;
}
// 初始化一个带头结点的链表
LinkNode initLinkNode(LinkNode &L){
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
return L;
}
int main(){
LinkNode L;
// 初始化
initLinkNode(L);
// 插入
//InsertTail(L);
InsertHead(L);
disPlay(L);
//查找
LNode * p=GetNodeByValue(L,1);
if(p==NULL){
cout<<"未找到"<<endl;
}else{
printf("%d\n",p->data);
}
LNode * q=GetNodeByIndex(L,1);
if(q==NULL){
cout<<"未找到"<<endl;
}else{
printf("%d\n",q->data);
}
//删除
deleteNode(L,2);
disPlay(L);
// 求表长
printf("表长是:%d\n",LinkLength(L));
system("pause");
}
总结
只是针对23考研记忆所用