线性表--顺序表、单链表、双链表 总结

线性表--顺序表、单链表、双链表 基础操作总结

函数:
         王道--数据结构--已在Visio Stdio 2019验证成功!
                     顺序表插入 删除 查找
                     单链表的头插法、尾插法,按值/按序查找,插入/删除
                     双链表的头插法、尾插法,按值/按序查找,插入/删除

验证:

// 栈、队列与顺序表.cpp : 此文件包含 "main" 函数。
#include <iostream>
#include "stdio.h"
#define MaxSize 50 
typedef int  ElemType;

typedef struct {//静态顺序线性表定义
    ElemType data[MaxSize];
    int length;
}SqList;

typedef struct{//动态顺序线性表定义
    ElemType * data;
    int seqlist_maxsize, Length;
}SeqList;
typedef struct LNode {//单链表定义
    ElemType data;
    struct LNode* next;
}*LinkList;
typedef struct DNode {//双链表定义
    ElemType data;
    struct DNode *prior,*next;
}DNode,*DLinkList;
/************************顺序线性表****************************/
//插入操作:在镜头顺序表L的第i位置插入新元素e;
bool ListInsert(SqList* L, int i,ElemType e )
{
    if (i<0 || i>L->length)
        return false;
    if (i > MaxSize)
        return false;
    for (int j = L->length; j >= i; j--)
        L->data[j] = L->data[j-1];
    L->data[i - 1] = e;
    L->length++;
    return true;
}
//删除操作:删除顺序表中的第i个元素,删除原始通过e返回
bool ListDelete(SqList &L,int i,ElemType *e)
{
    if (i<0 || i>L.length)
        return false;
    if (i > MaxSize)
        return false;
    *e = L.data[i-1];
    for (int j = i; j < L.length; j++)
        L.data[j-1] = L.data[j];
    L.length--;
    return true;
}
//顺序查找:按值查找
int LocateElem(SqList L, ElemType e)
{
    for (int i = 0; i < L.length; i++)
    {
        if (L.data[i] == e)
            return i + 1;
    }
    return 0;
}
/************************链式顺序表****************************/
void PrintLink(LNode* head)
{
    LNode* p = head->next;
    for (; p; p = p->next)
        printf("%5d", p->data);
}
//创建单链表1--头插法
LinkList List_HeadInsert(LinkList &L)
{
    LNode* s; int x;
    L = (LinkList)malloc(sizeof(LNode));//创建头节点
    L->next = NULL;                     //初始为空链表
    printf("头插法L输入节点数据:");
    scanf_s("%d",&x);
    while (x!=999)
    {
        s = (LNode*)malloc(sizeof(LNode));//创建新节点
        s->data = x;
        s->next = L->next;
        L->next = s;
        scanf_s("%d", &x);
    }
    return L;
}
//创建单链表2--尾插法
LinkList List_TailInsert(LinkList &L)
{
    LNode* s; int x;
    L = (LinkList)malloc(sizeof(LNode));//
    L->next = NULL;                     //初始为空链表
    LNode *r=L;                         //r为附加设置的表尾指针
    printf("\n尾插法L2输入节点数据:");
    scanf_s("%d", &x);
    while (x != 999)
    {
        s = (LNode*)malloc(sizeof(LNode));
        s->data = x;
        r->next = s;

        r=s;                          //r指向新的表尾结点
        scanf_s("%d", &x);
    }
    r->next = NULL;                    //尾结点指针置空
    return L;
}
//按序查找结点:查找单链表中第i个结点
LNode* GetElem(LinkList L,int i)
{
    int j = 1;
    LNode* p=L->next;//头结点指针 
    if (i == 0)//0返回头结点
        return L;
    if (i < 1)//无效返回空
        return NULL;
    while (p&&j < i)
    {
        p = p->next;
        j++;
    }
    printf("\n按序查找结果:%d", p->data);
    return p;
}
//按值查找结点:查找值为e的元素并返回该指针
LNode* LocateElem(LinkList L, ElemType e)
{
    LNode* p = L->next;
    while (p && p->data != e)
        p = p->next;
    if (p == NULL)
        printf("\n按值查找结果:无");
    else
        printf("\n按值查找结果:存在该元素");
    return p;
}
//插入新结点
bool ListFrontInsert(LinkList L, int i, ElemType e)
{
    LNode* p = L->next;
    p = GetElem(L,i-1);
    if (p == NULL) return false;
    LNode* s = (LNode*)malloc(sizeof(LNode));
    s->data = e;
    s->next=p->next;
    p->next = s;
    return true;
}
//删除新结点
bool ListDelete(LinkList L, int i)
{
    LNode* p = L->next;
    p = GetElem(L, i - 1);
    if (p == NULL) return false;
    p->next= p->next->next;
    return true;
    //LNode* p = L->next;
    //p = GetElem(L, i - 1);
    //if (p == NULL) return false;
    //LinkList q;
    //q = p->next;
    //p->next = q->next;
    //free(q);
    //return true;
}
/***********************双指针链式顺序表************************/
//创建双链表1--头插法
DLinkList Dlist_head_insert(DLinkList& DL) { //List_head_insert
    DNode* s; int x;
    DL = (DLinkList)malloc(sizeof(DNode));//建立头结点
    DL->next = NULL;
    DL->prior = NULL;
    printf("\n双链表-输入:");
    scanf_s("%d", &x);
    while (x != 999) {
        s = (DNode*)malloc(sizeof(DNode));
        s->data = x;
        s->next = DL->next;
        if (DL->next != NULL) {
            DL->next->prior = s;
        }
        s->prior = DL;
        DL->next = s;
        scanf_s("%d", &x);
    }
    return DL;
}
//创建双链表2--尾插法
DLinkList Dlist_tail_insert(DLinkList& DL) {//List_tail_insert
    int x;
    DL = (DLinkList)malloc(sizeof(DNode));
    DNode* s, * r = DL;
    DL->prior = NULL;
    printf("\n双链表-输入:");
    scanf_s("%d", &x);
    while (x != 999) {
        s = (DNode*)malloc(sizeof(DNode));
        s->data = x;
        r->next = s;
        s->prior = r;
        r = s;
        scanf_s("%d", &x);
    }
    r->next = NULL;
    return DL;
}
//按序查找结点:查找单链表中第i个结点
DNode* GetElem(DLinkList DL, int i) {
    int j = 1;
    DNode* p = DL->next;
    if (i == 0)
        return DL;
    if (i < 1)
        return NULL;
    while (p && j < i) {
        p = p->next;
        j++;
    }
    return p;
}
//插入新结点
bool DListFrontInsert(DLinkList DL, int i, ElemType e) {
    DLinkList p = GetElem(DL, i - 1);
    if (NULL == p) {
        return false;
    }
    DLinkList s = (DNode*)malloc(sizeof(DNode));
    s->data = e;
    s->next = p->next;
    p->next->prior = s;
    s->prior = p;
    p->next = s;
    return true;
}
//删除新结点
bool DListDelete(DLinkList DL, int i) {
    DLinkList p = GetElem(DL, i - 1);
    if (NULL == p) {
        return false;
    }
    DLinkList q;
    q = p->next;
    if (q == NULL)
        return false;
    p->next = q->next;
    if (q->next != NULL) { //删除最后一个元素,需要的判断 
        q->next->prior = p;
    }
    free(q);
    return true;
}
//打印双链表
void PrintDList(DLinkList DL) {
    DL = DL->next;
    while (DL != NULL) {
        printf("%3d", DL->data);
        DL = DL->next;
    }
    printf("\n");
}
//顺序线性表
void Seq_List()
{
    SqList L;
    int data_buff;
    for (int i = 0; i < 8; i++) { L.data[i] = i; L.length = i + 1; }
    printf("\n插入前:");
    for (int i = 0; i < L.length; i++) printf("%d\t", L.data[i]);

    if (true == ListInsert(&L, 1, 9))
    {
        printf("\n插入后:");
        for (int i = 0; i < L.length; i++) printf("%d\t", L.data[i]);
    }
    else
    {
        printf("\n插入 失败!");
    }

    if (true == ListDelete(L, 1, &data_buff))
    {
        printf("\n删除后:");
        for (int i = 0; i < L.length; i++) printf("%d\t", L.data[i]);
    }
    else
    {
        printf("\n删除失败");
    }
    data_buff = LocateElem(L, 3);
    if (data_buff == 0)
    {
        printf("\n查找失败!");
    }
    else
    {
        printf("\n按值查找到元素位置为%d!\n", data_buff);
    }
}
//单链表的操作
void Link_List()
{
    LNode* L,*head,*node,*L2;
    bool statue=false;
    //head = List_HeadInsert(L);//头插建立
    //PrintLink(head);
    head = List_TailInsert(L2); //尾插建立
    PrintLink(head);
    node=GetElem(L2,1);         //按序查找
    node=LocateElem(L2,3);      //按值查找
    if (true == ListFrontInsert(L2,2,0))
    {
        printf("\n插入成功!插入结果:");
        PrintLink(L2);
    }
    else
    {
        printf("\n插入失败!结果:");
        PrintLink(L2);
    }
    if (true == ListDelete(L2, 2))
    {
        printf("\n删除成功!删除结果:");
        PrintLink(L2);
    }
    else
    {
        printf("\n删除失败!结果:");
        PrintLink(L2);
    }
       
}
//双链表的操作
void DLink_List()
{
    DNode *DL, * DL2,*dead;
    ElemType buff;
    dead = Dlist_head_insert(DL);   //头插法
    PrintDList(DL);
    dead = Dlist_tail_insert(DL2);  //尾插法
    PrintDList(DL2);
    GetElem(DL2,1);                 //按序查找
    if (true == DListFrontInsert(DL2, 2, 0))  //在i位插入
    {
        printf("\n双链表插入成功!");
        PrintDList(DL2);
    }
    else
    {
        printf("\n双链表插入失败!");
    }
    
    if (true == DListDelete(DL2, 2))  //在i位插入
    {
        printf("\n双链表删除成功!");
        PrintDList(DL2);
    }
    else
    {
        printf("\n双链表删除失败!");
    }
}
int main()
{
    std::cout << "Hello World!\n";
    //Seq_List();//顺序表插入 删除 查找
    //Link_List();//单链表的头插法、尾插法,按值/按序查找,插入/删除
    DLink_List();//双链表的头插法、尾插法,按值/按序查找,插入/删除
    system("pause");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoxilang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值