王道数据结构(第二章:线性表)

  • 2.2线性表的顺序表示


#include <stdlib.h>
#include <iostream>
using namespace std;
//顺序表的定义
#define InitSize 10
typedef struct{
    int element[InitSize];
    int length;
} SqList0;
//静态分配
void initList0(SqList0& l){
    l.length=0;
}
typedef struct{
    int* element;
    int MaxSize;
    int length;
} SqList1;
//动态分配
void initList1(SqList1& l){
    l.element=(int*)malloc(sizeof(int)*InitSize);
    l.MaxSize=InitSize;
    l.length=0;
}
//扩容
void increaseSize(SqList1& l,int length){
    int* q=l.element;
    l.element=(int*)malloc((l.MaxSize+length)*sizeof(int));
    for(int i=0;i<l.length;i++){
        l.element[i]=q[i];
    }
    l.MaxSize+=length;
    free(q);
}
//打印
void printList(SqList1& l){
    for(int i=0;i<l.length;i++)
        cout<<l.element[i]<<' ';
    cout<<endl<<"length:"<<l.length<<endl;
}
//在位置i处插入数据
bool insertList(SqList1& l,int i,int e){
    if(i<1||i>l.length+1)return false;
    if(l.length>=l.MaxSize)return false;
    for(int j=l.length;j>=i;j--){
        l.element[j]=l.element[j-1];
    }
    l.element[i-1]=e;
    l.length++;
    return true;
}
//删除位置i的元素,用e存储删除的值
bool deletList(SqList1& l,int i,int& e){
    if(i<1||i>l.length)return false;
    if(l.length<=0)return false;
    e=l.element[i-1];
    for(int j=i;j<l.length;j++){
        l.element[j-1]=l.element[j];
    }
    l.length--;
    cout<<"删除的值为:"<<e<<endl;
    return true;
}
//按位置查找
int locateElement0(SqList1& l,int i){
    return l.element[i-1];
}
//按值查找,返回下标
int locateElement1(SqList1& l,int e){
    for(int i=0;i<l.length;i++){
        if(l.element[i]==e)return i;
    }
    return -1;
}
int main()
{
    SqList1 L;//定义
    initList1(L);//初始化
    increaseSize(L,3);//扩容
    insertList(L,1,2);//插入
    insertList(L,2,3);
    insertList(L,3,0);
    insertList(L,4,9);
    printList(L);//打印
    
    int e=-1;
    deletList(L,2,e);//删除
    printList(L);
    cout<<"第2个位置为:"<<locateElement0(L,2)<<endl;//查找
    cout<<"9这个值所在下标处:"<<locateElement1(L,9)<<endl;
    return 0;
}
  • 2.3线性表的链式表示 


#include <iostream>
#include <cstdlib>
using namespace std;
//单链表
typedef struct LNode{
    int data;
    LNode* next;
}LNode,*LinkList;
//初始化(不带头结点的)
bool initList0(LinkList& L){
    L=NULL;//空表
    return true;
}
//初始化(带头结点的)
bool initList1(LinkList& L){
    L=(LNode*)malloc(sizeof(LNode));
    if(L==NULL)return false;//创建头节点失败
    L->next=NULL;
    return true;
}
//后插
bool insertNextNode(LNode* p,int i){
    if(p==NULL)return false;
    LNode* q=(LNode*)malloc(sizeof(LNode));
    if(q==NULL)return false;//创建失败
    q->data=i;
    q->next=p->next;
    p->next=q;
    return true;
} 
//前插
bool insertPriorNode(LNode* p,int i){
    if(p==NULL)return false;
    LNode* q=(LNode*)malloc(sizeof(LNode));
    if(q==NULL)return false;//创建失败
    q->next=p->next;
    p->next=q;
    q->data=p->data;
    p->data=i;
    return true;
}
//按位置插入(不带头结点)
bool ListInsert0(LinkList& L,int i,int e){
    if(i<1)return false;
    //对于第一个位置需要特殊处理
    if(i==1){
        LNode* s=(LNode*)malloc(sizeof(LNode));
        s->next=L;
        s->data=e;
        L=s;//新表的首位
        return true;
    }
    LNode* p=L;
    int j=1;
    while(p!=NULL&&j<i-1){
        p=p->next;
        j++;
    }//循环到i-1位置处跳出循环
    if(p==NULL)return false;//i的位置不合法
    //后插法即可
    return insertNextNode(p,e);
}
//按位置插入(带头结点)
bool ListInsert1(LinkList& L,int i,int e){
    if(i<1)return false;
    LNode* p=L;
    int j=0;
    while(p!=NULL&&j<i-1){
        p=p->next;
        j++;
    }//循环到i-1位置处跳出循环
    if(p==NULL)return false;//i的位置不合法
    //后插法即可
    return insertNextNode(p,e);
}
//按位置删除
bool delteNodeByLocation(LinkList& L,int i,int& e){
    if(i<1)return false;
    LNode* p=L;
    int j=0;
    while(p!=NULL&&j<i-1){
        p=p->next;
        j++;
    }
    if(p==NULL)return false;//i的位置不合法
    if(p->next==NULL)return false;//i-1之后放好没有节点
    LNode* q=p->next;
    e=q->data;
    p->next=q->next;
    free(q);
    return true;
}
//指定节点删除
bool deleteNode(LNode* p){
    if(p==NULL)return false;//如果指定节点是最后一个,则q节点为空不合法
    LNode* q=p->next;
    p->data=q->data;
    p->next=q->next;//p被后面节点的值覆盖
    free(q);//删除多余的节点
    //偷梁换柱
    return true;
}
//打印
void printList(LinkList& L){
    if(L==NULL)return;
    LNode* p=L->next;
    while(p!=NULL){
        cout<<p->data<<" ";
        p=p->next;  
    }
    cout<<endl;
}
//按位置查找,返回第i个元素
LNode* GetNodebyLocation(LinkList L,int i){
    if(i<0)return NULL;
    LNode* p=L;
    int j=0;
    while(p!=NULL&&j<i){
        p=p->next;
        j++;
    }
    return p;
}
//按值查找,返回值为e的节点
LNode* GetNodeByValue(LinkList L,int e){
    LNode* p=L->next;
    while(p!=NULL&&p->data!=e)
        p=p->next;
    return p;
}
//求表的长度
int length(LinkList L){
    int len=0;
    LNode* p=L;
    while(p!=NULL){
        p=p->next;
        len++;
    }
    return len;
}
int main(){
    LinkList L;//定义
    initList1(L);//有头节点初始化
    ListInsert1(L,1,1);//插入
    ListInsert1(L,1,2);
    ListInsert1(L,1,3);
    ListInsert1(L,1,9);
    printList(L);//打印
    int e=0;
    delteNodeByLocation(L,2,e);//按位置删除
    cout<<"e的值为:"<<e<<endl;
    printList(L);
    deleteNode(L);//删除头节点
    printList(L);
    insertPriorNode(L,12);//前插
    printList(L);
    ListInsert0(L,2,2);//没有头节点的插入
    printList(L);
}
  • 2.3.2_3单链表的建立 


#include <iostream>
#include <cstdlib>
using namespace std;
//单链表
typedef struct LNode{
    int data;
    LNode* next;
}LNode,*LinkList;
//初始化单链表(带头结点的)
bool InitList(LinkList& L){
    L=(LNode*)malloc(sizeof(LNode));
    if(L==NULL)return false;
    L->next=NULL;
    return true;
}
//尾插法建立单链表
bool List_TailInsert(LinkList& L){
    int x;
    L=(LNode*)malloc(sizeof(LNode));
    LNode *s,*r=L;
    cin>>x;
    while(x!=9999){
        s=(LNode*)malloc(sizeof(LNode));
        s->data=x;
        r->next=s;
        r=s;
        cin>>x;
    }
    r->next=NULL;
    return L;
}
//头插法建立单链表
LinkList List_HeadInsert(LinkList& L){
    LNode* s;
    int x;
    L=(LNode*)malloc(sizeof(LNode));
    L->next=NULL;//初始化为空,很关键
    cin>>x;
    while(x!=9999){
        s=(LNode*)malloc(sizeof(LNode));
        s->next=L->next;
        L->next=s;
        s->data=x;
        cin>>x;
    }
    return L;
}
//打印
void printList(LinkList& L){
    if(L==NULL)return;
    LNode* p=L->next;
    while(p!=NULL){
        cout<<p->data<<" ";
        p=p->next;  
    }
    cout<<endl;
}
int main(){
    LinkList L;//定义
    //List_TailInsert(L);
    List_HeadInsert(L);
    printList(L);
}
  • 2.3.3双链表

#include <iostream>
#include <cstdlib>
using namespace std;
typedef struct DNode{
    int data;
    struct DNode *prior,*next;
}DNode,*DLinklist;
//初始化
bool InitDLinklist(DLinklist& L){
    L=(DNode*)malloc(sizeof(DNode));
    if(L==NULL)return false;
    L->prior=NULL;
    L->next=NULL;
    return true;
}
//在p节点后插入s节点
bool InsertNextDNode(DNode* p,DNode* s){
    if(p==NULL||s==NULL)return false;
    s->next=p->next;
    if(p->next!=NULL)p->next->prior=s;
    p->next=s;
    s->prior=p;
    return true;
}
//删除p结点的后继结点
bool DeleteNextDNode(DNode* p){
    if(p==NULL)return false;
    DNode* q=p->next;
    if(q->next!=NULL)
        q->next->prior=p;
    free(q);
    return true;
}
//双链表的删除
void DestroyList(DLinklist& L){
    while(L->next!=NULL)
        DeleteNextDNode(L);
    free(L);
    L=NULL;
}
int main(){
    DLinklist L;
    InitDLinklist(L);
    DestroyList(L);
}
  •  2.3.4循环链表

#include <iostream>
#include <cstdlib>
using namespace std;
//循环单链表
typedef struct LNode{
    int data;
    LNode* next;
}LNode,*LinkList;
//初始化循环单链表
bool InitList(Linklist& L){
    L=(LNode*)malloc(sizeof(LNode));
    if(L==NULL)return false;
    L->next=L;
    return true;
}
//判断循环链表是否为空
bool Empty(LinkList& L){
    return (L->next==L);
}
//判断p结点是否为循环单链表的尾结点
bool isTail(LinkList& L,LNode* p){
    return (p->next==L);
}
typedef struct DNode{
    int data;
    DNode *prior,*next;
}DNode,*DLinklist;
//初始化双向循环链表
bool InitDLinklist(DLinklist& L){
    L=(DNode*)malloc(sizeof(DNode));
    if(L==NULL)return false;
    L->prior=L;
    L->next=L;
    return true;
}
//双向循环链表的插入
bool InsertNextNode(DNode* p,DNode* s){
    s->next=p->next;
    p->next->prior=s;
    s->prior=p;
    p->next=s;
}
//删除p的后继结点q
bool DeleteNextDNode(DNode* p){
    DNode* q=p->next;
    p->next=q->next;
    p->next->prior=p;
    free(q);
    return true;
}
  • 2.3.5静态链表

#include <iostream>
#include <cstdlib>
using namespace std;
#define Maxsize 100

typedef struct LNode {
    int data;
    int next;
} LinkList[Maxsize];

// 初始化链表
void InitList(LinkList &L) {
    L[0].next = -1; // 头节点的next设置为-1,表示链表为空
    for (int i = 1; i < Maxsize; i++) {
        L[i].next = -2; // 使用-2表示该位置是空闲的
    }
}

// 在链表的第i个位置插入元素e
bool ListInsert(LinkList &L, int i, int e) {
    if (i < 1 || i >= Maxsize) return false; // 检查插入位置的合法性
    int j = 0;
    // 查找第i-1个位置
    for (int k = 1; k < i; k++) {
        j = L[j].next;
        if (j == -1) return false; // 如果已经到达链表末尾
    }
    // 查找空闲位置
    int free = 1;
    while (L[free].next != -2 && free < Maxsize) free++;
    if (free == Maxsize) return false; // 没有空闲位置
    L[free].data = e;
    L[free].next = L[j].next;
    L[j].next = free;
    return true;
}

// 删除链表的第i个元素
bool ListDelete(LinkList &L, int i) {
    if (i < 1 || i >= Maxsize) return false;
    int j = 0;
    // 查找第i-1个位置
    for (int k = 1; k < i; k++) {
        j = L[j].next;
        if (L[j].next == -1) return false; // 如果已经到达链表末尾
    }
    int toDelete = L[j].next;
    if (toDelete == -1) return false; // 没有元素可以删除
    L[j].next = L[toDelete].next;
    L[toDelete].next = -2; // 将删除的位置标记为空闲
    return true;
}
// 打印链表所有元素
void PrintList(LinkList &L) {
    int j = L[0].next; // 从头节点开始
    while (j != -1) {
        cout << L[j].data << " ";
        j = L[j].next;
    }
    cout << endl;
}

int main() {
    LinkList L;
    InitList(L);
    ListInsert(L, 1, 10);
    ListInsert(L, 2, 20); 
    ListInsert(L, 3, 5);
    ListInsert(L, 2, 90);
    ListInsert(L, 2, 17);
    cout << "After insertions: ";
    PrintList(L); // 打印插入后的链表
    ListDelete(L, 1); // 删除链表第1个位置的元素
    cout << "After deletion: ";
    PrintList(L); // 打印删除后的链表

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值