数据结构(严版)课本代码重敲——第二章

复习笔记 数据结构 第二章 线性表

说明:数据结构高分笔记上的经典编程题

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define dataSize 20
#define ERROR -1
using namespace std;
/*
    题目:数据结构 cha2 线性表
    内容:1. 顺序表的操作
    日期:2018/3/9
    时间:tomato * 2
    笔记:1. 线性表包括顺序表和链表
    2. 顺序表是逻辑和存储结构均为线性连续的数组形式,一般用数组表示
    3.链表分为单链表和双链表,包括带头结点和不带头结点两种类型,也包括循环和非循环两种类型
    还有一种特殊的“静态链表”
*/
/* 顺序表的定义方式
    注意:typedef的含义是给这个结构体起的名字叫做Sqlist,是一种用户自定义的数据类型
    而平时编程中struct student {}stu[20];则是C++中的简略写法,stu[20]即为创建的
    数据类型为Student的数组变量
*/
typedef struct
{
    int data[dataSize];
    int length;
}Sqlist;


typedef int Elemtype;


/* (1)以下为顺序表的基本操作
    1. 初始化
    2. 按元素值的查找
    3. 求指定位置元素
    4. 插入元素
    5. 删除元素
    笔记:1.是否用&取决于改结构体的内容
*/
void initSqlist(Sqlist &l)
{
    l.length = 0;
}
int findElem(Sqlist l,Elemtype x)
{
    for (int i=0;i<l.length;i++)
    {
        if (l.data[i] == x)
            return i;
    }
    return ERROR;
}
Elemtype getElem(Sqlist l, int loc)
{
    if (loc < 0 || loc > l.length-1)
        return ERROR;
    return l.data[loc];
}
void insertSqlist(Sqlist &l,Elemtype x,int loc)
{
    if (loc < 0 || loc >l.length-1)
        cout<<"error";
    for (int i=l.length-1 ; i >= loc ; i--  )
    {
        l.data[i+1] = l.data[i];
    }
    l.data[loc] = x;
    l.length++; // ★★★ 勿忘!
}
Elemtype deleteSqlist(Sqlist &l,int loc,Elemtype &x)
{
    if (loc<0||loc>l.length-1)
        {cout << "error";return 0;}
    x = l.data[loc];
    for (int i=loc;i<l.length-1;i++)
    {
        l.data[i] = l.data[i+1];
    }
    l.length -- ;
    return x;
}
// 单链表结点定义
typedef int Elemtype;
typedef struct LNode
{
    Elemtype data;
    struct LNode *next;
}LNode;

/*
    (2)单链表的操作
    1. 创建单链表 尾插法和头插法
    2. 归并单链表 递增和递减(头插法)
    3. 查找单链表
    4. 插入单链表
    5. 删除
    6. 打印链表内容
    7. 查找x并删除
*/
// 头插法
void createLNode(LNode *&h,int n)
{
    // 1. 创建头结点
    h = (LNode *)malloc(sizeof(LNode));
    h->next = NULL;
    Elemtype x;
    cout<<"输入线性表数据"<<endl;
    LNode *q;
    q = h;
    for(int i=0;i<n;i++)
    {
        cin >> x;
        q = (LNode *)malloc(sizeof(LNode));
        q->data = x;
        q->next = h->next;
        h->next = q;
    }

}
// 尾插法
void createLNodeH(LNode *&h,int n)
{
    h = (LNode *)malloc(sizeof(LNode));
    h->next = NULL;
    LNode *p,*q;
    q = h;
    int x;
    cout <<"数据:"<<endl;
    for (int i=0;i<n;i++)
    {
        cin >> x;
        p = (LNode *) malloc(sizeof(LNode));
        p->data = x;
        q->next = p;
        q = p;
    }
    p->next = NULL; // 最后赋值即可

}
void print(LNode *h)
{
    LNode *t = h;
    while (t->next!=NULL)
    {
        t = t->next;
        cout<<t->data<<' ';
    }
    cout << endl;
}
void mergeLNode(LNode *&a,LNode *&b,LNode *&c)
{
    LNode *pa,*pb,*pc;
    pa = a->next;pb=b->next;
    pc = (LNode *)malloc(sizeof(LNode));
    c = pc ;
    while (pa!=NULL && pb!=NULL)
    {
        cout <<"test"<<endl;
        if (pa->data >= pb->data)
        {
            pc->next = pb;
            pb = pb->next;
            pc = pc->next;
        }
        else
        {
            pc->next = pa;
            pa = pa->next;
            pc = pc->next;
        }
    }
    pc->next = NULL;
    if (pa!=NULL)
    {
        pc->next = pa;
    }
    if (pb!=NULL)
    {
        pc->next = pb;
    }

}
void merge_2(LNode *&a,LNode *&b,LNode *&c)
{
    LNode *pa,*pb,*pc;
    pa = a->next; pb = b->next;
    c = (LNode *)malloc(sizeof(LNode));
    pc = c;

    while (pa!=NULL && pb!=NULL)
    {
        if (pa->data >= pb->data)
        {
            pc = pb;
            pb = pb->next;
            pc -> next = c->next;
            c->next = pc;
        }
        else
        {
            pc = pa;
            pa = pa->next;
            pc -> next = c->next;
            c->next = pc;
        }
    }
    while (pa!=NULL)
    {
        pc = pa;
        pa = pa->next;
        pc -> next = c->next;
        c->next = pc;
    }
    while (pb!=NULL)
    {
        pc = pb;
        pb = pb->next;
        pc -> next = c->next;
        c->next = pc;
    }
}

int findAndDelete(LNode *l,Elemtype x)
{
    LNode *p = l,*q;

    while (p->next!=NULL)
    {
       if (p->next->data == x)
       {
           q = p->next ;
           p->next = q->next;
           return 1;
       }
       p = p->next;
    }
    return 0;
}
// 双链表结点定义
typedef struct DLNode
{
    Elemtype data;
    struct DLNode *prior;
    struct DLNode *next;
}DLNode;

/*
    1.双链表的建立
    2. 查找结点
    3. 插入结点,在p之后
*/
void createDLNode(DLNode *&dl,int n)
{
    dl = (DLNode *)malloc(sizeof(DLNode));
    dl ->prior = NULL;
    DLNode *p,*q;
    p = dl;
    cout<<"data:"<<endl;
    int x;
    for (int i=0;i<n;i++)
    {
        q = (DLNode *)malloc(sizeof(DLNode));
        cin >> x;
        q->data = x;
        p->next = q;
        q->prior = p;
        p = q;
    }
    p->next = NULL;

}

int main()
{
    DLNode *dl;
    int n;
    cout<<"数据个数n:"<<endl;
    cin>>n;
    createDLNode(dl,n);
    print(dl);
    return 0;
}

数据结构》(C语言版) 算法源码及运行演示系统使用说明 一、启动演示系统 双击演示系统应用程序文件“DS_VC_ALGO.EXE”启动演示系统,出现图1所示界面。 图1 《数据结构》(C语言版)算法源码及运行演示系统主界面 二、演示系统使用步骤 除了个别算法之外,演示系统给出了《数据结构》(C语言版)书中算法对应的程序代码(CPP文件)和测试运行程序(VC++6.0的EXE文件)。通过本系统,可以显示算法的源代码以及运行结果。具体操作步骤如下: 1.选择相应章 单击演示系统界面右侧章选择按钮。 例如,要选择第6章,则单击“第6章”选择按钮。 当相应章被选择后,窗口的右侧部分将列出本章的算法选择按钮。 例如,选择第6章后,窗口的右侧部分将显示第6章中的算法6.1-6.13和6.15的选择按钮。由于书中的算法6.14和6.16只是示意性算法,故未给出源码,其按钮上的文字为灰色,处于“无效”状态。 2.选择相应章中的算法 单击窗口右侧部分所列举的本章某个算法选择按钮,被选择的算法的源码将在窗口左侧空白区域中显示。对于较长的源码,单击显示区域后,可用键盘的光标键和翻页键浏览源码。 例如,选择了第6章中的算法6.5后界面如图2所示: 图2 选择算法6.5 3.运行测试程序 单击窗口上部的“运行”按钮,将弹出运行窗口,运行所选算法的测试程序。若运行按钮为灰色,表示该算法无单独测试程序。 例如,算法6.5的测试运行窗口如图3所示: 图3 测试运行窗口 测试运行说明: 测试运行窗口显示程序的执行过程及结果。若在显示过程中出现运行窗口无法正常演示的情况,只需调节运行窗口大小即可正常显示(调节最小化按钮或窗口最大化/还原按钮“ ”)。 三、退出演示系统 使用完毕后,单击窗口右上角关闭按钮“ ”退出演示系统。 四、测试程序示例 在《数据结构》的课程教学中,各抽象数据类型的设计与实现是重要的学习和实践环节。为此,本系统只给出了各算法源码的测试程序的可执行文件。在此,给出算法6.5的测试程序示例,以供参考。 算法6.5是中序遍历线索二叉树的非递归算法,要对其源码进行测试,可首先调用算法6.6及6.7建立中序线索二叉树。以下是测试程序的源码,相关类型和辅助函数定义在文件include06.h和include06.cpp中,此略。 // test0605.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "include06.h" // 相关类型和辅助函数的定义 BiThrTree pre; // 线索二叉树遍历辅助变量 #include "algo0607.cpp" // 算法6.7源码 #include "algo0606.cpp" // 算法6.6源码 #include "algo0605.cpp" // 算法6.5源码 int main(int argc, char* argv[]) { char gl_str[64]; BiThrTree T; BiThrTree Thrt; printf("*******************************************\n"); printf("* 《数据结构》(C语言版)蔚敏,吴伟民 *\n"); printf("* 算法6.5, 6.6 & 6.7 *\n"); printf("*******************************************\n"); srand((unsigned)time(NULL)); // 随机函数初始化 T=NULL; // 空二叉树T for (int pass=0; pass<5; pass++) { // 测试运行5次,第一次为空树 outBiThrTree(T,gl_str); // 以类广义表的形式输出二叉树T到gl_str printf("T = %s\n", gl_str); // 显示 pre = NULL; Status r = InOrderThreading(Thrt, T); // 算法6.6,6.7,中序线索化 printf("InOrderThreading(Thrt, T) : %s\n", (r) ? "OK" : "ERROR"); initVisitStr(); // 将visitStr清为空串 InOrderTraverse_Thr(Thrt, v
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值