数据结构与算法-编写实例

这篇算是学习过程中的备忘录,之前没有好好敲过这门课的代码,现在开始把每节课敲的代码记录下来,方便期末复习和以后使用。

第一节课:线性表的基本操作

#include <cstdio>//C++的编译
#include <cstdlib> 
#include <iostream>//c++输入输出
using namespace std;//命名空间

#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2 
typedef int Status;// 状态 是个整型 

typedef int ElemType;
typedef struct{
    ElemType *elem;//数据的基地址 
    int length;//实际长度 
}SqList;
//1.初始化操作 
Status InitList(SqList &L){
//不引用的话,创建可以成功, 但是申请空间给了形参。对参数的值有改变则需要引用,否则都行。 
    L.elem = new int[MAXSIZE];//MAXSIZE个整形空间 
    if(L.elem==NULL)//没有申请空间成功,失败 
    {
//        printf("fail!");
        return ERROR;//exit(OVERFLOW);
    }    
    L.length=0;
    return OK;
}
//2.销毁线性表
void DestroyList(SqList &L) 
{
    if(L.elem)
        delete []L.elem;//不需要写free了 
}
//3.清空
void ClearList(SqList &L) 
{
    L.length=0;//长度置为0 
}
//4.显示线性表
void DispList(SqList &L)//参数引用不引用都可以 
{
    int i;
    for(i=0;i<L.length;i++)
        printf("[%d]",L.elem[i]);
    printf("\n");
}
//5.求长度 
int LengthList(SqList &L)
{
    return L.length;
}
//6.判断是空 7.是满(return (L.length==MAXSIZE);)
bool isEmptyList(SqList &L) 
{
//    return L.length==0?1:0;
    return (L.length==0);
//    if(L.length ==0)
//        return 1;
//    else
//        return 0;
}
//8.查: 按位置  按值
Status GetItem(SqList &L,int i,ElemType &e)//在L中找第i个元素 
{
    if(i<1 || i>L.length)
        return ERROR;
    e=L.elem[i-1];
    return OK;
}
int LocateItem(SqList &L,ElemType e)//在L中找到e值,并返回位置 
{
//    int i;
//    for(i=0;i<L.length ;i++)
//        if(L.elem[i]==e)
//            return i+1;
//    return 0;
    int i=0;
    while(i<L.length && L.elem[i]!=e)
        i++;
    if(i==L.length) return 0;//找完了没找到
    else return i+1; 
}
//9.在第i个元素前插入 e
Status InsertList(SqList &L,int i,ElemType e)
{
    int j;
     if(i<1||i>L.length+1)//判断位置是否合法 
         return ERROR;
     if(L.length==MAXSIZE) return ERROR;//if(isFullList(L))
    for(j=L.length-1;j>i-1;j--)
         L.elem[j+1]=L.elem[j];
     L.elem[i-1]=e;
     L.length++;
     return OK;
}
//10.在L中删除第i个元素,把要删除的数据放到e中
Status DeleteList(SqList &L,int i,ElemType &e) 
{
    int j;
    if(i<1 || i>L.length)
        return ERROR;
    e=L.elem[i-1];//在被删掉之前保存在e中 
    for(j=i;j<L.length;j++)
        L.elem[j-1]=L.elem[j];//相当于把下标为i-1,即第i个元素被后边给覆盖了
//    for(j=i-1;j<L.length-1;j++) 
//        L.elem[j]=L.elem[j+1]//被后边元素覆盖 
    L.length--;
    return OK;
}
int main(){
    SqList L;
    int i;
    if(InitList(L)==1)
    {
        printf("success! lentgh=%d\n",L.length);
    }
    for(i=0;i<5;i++)
        L.elem[i]=i;//添加一些元素测试 
    L.length=5;
    DispList(L);
    return 0;
}

  日后更。2020-02-29  12:34:21

第二节课:单链表基本操作

实现单链表常用的操作:初始化、判空、清空、计数(长度)、按位置查找、按值查找、插入、删除、创建(前插法)、创建(尾插法)、逆置、显示等。

#include <cstdio> 
#include <cstdlib>

#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;

typedef struct Node{
    int data;
    struct Node *next;
}LNode,*LinkList;


//初始化 
Status InitList(LinkList &L){
    L=new Node;
    if(!L) return 0;
    L->next=NULL;
    return 1;
}
//前插法 .数都是倒着的 
void CreateList(LinkList &L,int n){
    LNode *p;
    L=new LNode;
    L->next=NULL;
    int i;
    p=L->next;
    printf("请输入元素:\n");
    for(i=n;i>0;--i)
    {
        p=new LNode;
//        printf("请输入元素:\n");
        scanf("%2d",&p->data);
        p->next=L->next;
        L->next=p;
    }
}
//后插法,顺序正着来啦. 
void CreateList_L(LinkList &L,int n){
    int i;
    L=new LNode;
    L->next=NULL;
    LNode *r,*p;
    r=L;//刚开始指向头结点
    printf("请输入元素:\n");
    for(i=0;i<n;++i){
        p=new LNode;
        
        scanf("%2d",&p->data);
        p->next=NULL;
        r->next=p;//插入到表尾
        r=p;//r指向新的尾节点 
    }
}
//遍历 
void DispList(LinkList L){//不改动数值可以不引用& 
     LNode *p;
     p=L->next;//指向第一个节点 
     printf("->");
     while(p)//p!=NULL
     {
         printf("%d->",p->data);
         p=p->next;
     }
 }
 //求表长 
int LengthList(LinkList L){
    LNode *p;
    int i=0;
    p=L->next;
    while(p){
        i++;
        p=p->next;
    }
    return i;
}
//判断是否为空 
bool isEmptyList(LinkList L){
    return L->next==NULL;
}
//按位置查找元素 
LNode *GetItem(LinkList L,int i){
    LNode *p=L->next;
    int j=1;
    while(p!=NULL && j<i){
        j++;
        p=p->next;
    }

//    if(p){
//        printf("第%d个位置的元素是:%d\n",i,p);
//    }else
//        printf("没找到该位置!\n");
    return p;
}
//插入到指定位置前
Status InsertList(LinkList &L,int i,ElemType e){
    LNode *p;
    if(i<1) return 0;
    if(i>1) p=GetItem(L,i-1);
    else p=L;
    if(p==NULL) return 0;
    LinkList s;
    s=new LNode;
    s->data=e;
    s->next=p->next;
    p->next=s;
    return 0;
}
//删除操作
Status DeleteList(LinkList &L,int i)
{
    LNode *p=L;
    //找第i-1个结点, 并判断 p 后面有没有结点 
    p=L;
    int j=0;
    while(p->next && j<i-1)//
    {
        j++;
        p=p->next;
    }
    if(p->next==NULL||j>i-1)
        return ERROR;
    LNode *s;
    s=p->next;
//    e=s->data;
    p->next=s->next;//p->next=p->next->next
    delete s;
    return OK;
    if(p==NULL || j>i-1)
        return ERROR;
}
//销毁表 
Status DestroyList(LinkList &L){
    LinkList p;
    while(L){
        p=L;
        L=L->next;
        delete p;
    }
    return OK;
}
//按值查找 
int LocateItem(LinkList L,ElemType e)
{
    int i=1;
    LNode *p = L->next;
    while(p&&p->data!=e)
    {
        p=p->next;
        i++;
    }
    return i;
}
//清空表 
Status ClearList(LinkList &L){
    LinkList p,q;
    p=L->next;
    while(p){
        q=p->next;
        delete p;
        p=q;
    }
    L->next=NULL;
    return OK;
}
//逆置
void reverse(LinkList &H) {
    LNode *p,*q;
    p=H->next;
    H->next=NULL;
    while(p!=NULL){
        q=p;
        p=p->next;
        q->next=H->next;
        H->next=q;
    }
}
void tool(){
    printf("------------------------------>\n");
    printf("_____功能菜单______\n");
    printf("1.初始化\n 2.创建(前插法)\n 3.创建(后插法)\n 4.插入\n 5.显示\n 6.删除\n 7.逆置\n 8.判空\n 9.表长\n 10.清空\n 11.销毁\n 12.按位置查找\n 13.按值查找\n");
    printf("按其他键退出!\n");
    printf("------------------------------>\n");
}
void menu(LinkList &L){
    int i,n;
    ElemType e;
    tool();
    while(true){
    printf("按0可查看菜单\n");
    printf("请选择:\n");
    scanf("%d",&i);
    switch(i){
        case 1:
            printf("初始化成功!\n");
            InitList(L);
            break;
        case 2:
            printf("前插法:请输入插入数量\n");
            scanf("%d",&n);
            CreateList(L,n);
            break;
        case 3:
            printf("尾插法:请输入插入数量\n");
            scanf("%d",&n);
            CreateList_L(L,n);
            break;
        case 4:
            printf("请输入插入位置和插入数值\n");
            scanf("%d%d",&n,&e);
            InsertList(L,n,e);
            break;
        case 5:
            DispList(L);
            break;
        case 6:
            printf("请输入删除位置:\n");
            scanf("%d",&n);
            DeleteList(L,n);
            break;
        case 7:
            //逆置
            reverse(L);
            break;
        case 8:
            if(isEmptyList(L))
            printf("空的!\n");
            else
            printf("不是空的!\n");
            break;
        case 9:
            printf("表长为:%d\n",LengthList(L));
            break;
        case 10:
            ClearList(L);
            printf("清空成功!\n");
            break;
        case 11:
            DestroyList(L);
            printf("销毁成功!\n");
            break;
        case 12:
            printf("请输入查找的位置:\n");
            scanf("%d",&n);
            if(GetItem(L,n))
            printf("查找的值是:%d\n",GetItem(L,n)->data);
            else
            printf("没找着!\n");
            break;
        case 13:
            printf("请输入要查找的值\n");
            scanf("%d",&e);
            if(LocateItem(L,e))
                printf("要查找的元素在第%d位\n",LocateItem(L,e));
            else
                printf("没找着!\n");
            break;
        case 0:
            tool();
            break;
        default:
            printf("再见!\n");
            exit(0);
    }
}
}
int main(){
    LinkList L;
    menu(L);
}

实现在有序的单链表插入元素,仍保持其有序性

#include <cstdio> 
#include <cstdlib>

#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;

typedef struct Node{
    int data;
    struct Node *next;
}LNode,*LinkList;
//初始化 
Status InitList(LinkList &L){
    L=new Node;
    if(!L) return 0;
    L->next=NULL;
    return 1;
}
void CreateList_L(LinkList &L,int n){
    int i;
    L=new LNode;
    L->next=NULL;
    LNode *r,*p;
    r=L;//刚开始指向头结点
    for(i=0;i<n;++i){
        p=new LNode;
        printf("请输入元素:\n");
        scanf("%d",&p->data);
        p->next=NULL;
        r->next=p;//插入到表尾
        r=p;//r指向新的尾节点 
    }
}
//遍历 
void DispList(LinkList L){//不改动数值可以不引用& 
     LNode *p;
     p=L->next;//指向第一个节点 
     printf("->");
     while(p)//p!=NULL
     {
         printf("%d->",p->data);
         p=p->next;
     }
 }
LNode* InsertList(LinkList &L,ElemType e){
     LNode *p;
    LinkList s;
     p=L->next;
     
     while(p->next!=NULL){
         if(e<p->next->data)
         {
         s=new LNode;
         s->data=e;
         s->next=p->next;
         p->next=s;
         break;
         }
//        printf("->\n");
        p=p->next;
     }
//     DispList(p);
     return 0;
 }
 int main(){
     LinkList L;
     int i;
     ElemType e;
     InitList(L);
     printf("请输入五个元素\n");
     CreateList_L(L,5);
     printf("请输入要插入的数值:\n");
     scanf("%d",&e);
     InsertList(L,e);
     DispList(L);
 }

实现有序链表A,B的合并,

  1)仍保持其有序性 

  2)改为逆序

#include <cstdio> 
#include <cstdlib>

#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;

typedef struct Node{
    int data;
    struct Node *next;
}LNode,*LinkList;
//初始化 
Status InitList(LinkList &L){
    L=new Node;
    if(!L) return 0;
    L->next=NULL;
    return 1;
}
void CreateList_L(LinkList &L,int n){
    int i;
    L=new LNode;
    L->next=NULL;
    LNode *r,*p;
    r=L;//刚开始指向头结点
    for(i=0;i<n;++i){
        p=new LNode;
        printf("请输入元素:\n");
        scanf("%d",&p->data);
        p->next=NULL;
        r->next=p;//插入到表尾
        r=p;//r指向新的尾节点 
    }
}
//遍历 
void DispList(LinkList L){//不改动数值可以不引用& 
     LNode *p;
     p=L->next;//指向第一个节点 
     printf("->");
     while(p)//p!=NULL
     {
         printf("%d->",p->data);
         p=p->next;
     }
 }
 //有序链表的合并 
 LNode* MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){
     LNode *pa,*pb,*pc;
     
    pa=La->next;
     pb=Lb->next;
     pc=Lc=La;
     while(pa && pb){
         if(pa->data<=pb->data){
             pc->next=pa;
             pc=pa;
             pa=pa->next;
         }
         else{
             pc->next=pb;
             pc=pb;
             pb=pb->next;
         }
         
         pc->next=pa?pa:pb;
         delete Lb;
     }
     
 }
 //逆置
void reverse(LinkList &H) {
    LNode *p,*q;
    p=H->next;
    H->next=NULL;
    while(p!=NULL){
        q=p;
        p=p->next;
        q->next=H->next;
        H->next=q;
    }
}
int main(){
    int i;
    LinkList L,S,C;//L:表一, S:表二 C:表一表二合并表三 
    L=new LNode;
    S=new LNode;
    LNode *r,*p;
    InitList(L);
    InitList(S);
    //为表1初始化元素 
    r=L;
    for(i=0;i<5;++i){
        p=new LNode;
        p->data=2*i;
        p->next=NULL;
        r->next=p;//插入到表尾
        r=p;//r指向新的尾节点 
    }
    //为表2初始化元素
    r=S;
    for(i=0;i<5;++i){
        p=new LNode;
        p->data=2*i+1;
        p->next=NULL;
        r->next=p;//插入到表尾
        r=p;//r指向新的尾节点 
    } 
    printf("表A元素为:\n");
    DispList(L);
    printf("\n----------------------->\n");
    printf("表B元素为:\n");
    DispList(S);
    printf("\n----------------------->\n");
    printf("表A表B合并后的有序表为::\n");
    MergeList_L(L,S,C);
    DispList(C);
    printf("\n----------------------->\n");
    printf("改为逆序后为:\n") ;
    reverse(C);
    DispList(C);
}

-------------------实验那么多,老是忘记把笔记存到博客上,争取下次不要忘。2020-03-15  13:22:49

posted @ 2020-02-29 12:35  园友1951504  阅读(452)  评论(0)    收藏  举报