数据结构学习[有王道系列丛书的大题编程实例,仅分享,如有任何错误或者好的方法,请留言指出,本人必定虚心求教]

9 篇文章 0 订阅
4 篇文章 1 订阅

简介

按照课本的安排,我会先将书中每章节的实例给出大家一份能上机调试的整套的代码,争取有c和c++两套。而后所有涉及到编程的大题,本人也会陆续给出大家能上机调试的代码,争取有c和c++两套。

线性表

1.讲解内容实例

1.1 线性表顺序存储静态分配C语言实例

本代码分为三个文件:sqlist.h,sqlist.c,main.c(ps:maic.c只是为了调用进行测试)
编译通过下载链接:点此进行下载
sqlist.h:

#include <stdio.h>
#include <stdbool.h>
#ifndef __hello_h_
#define __hello_h_

#define MAXSIZE 100
/**固定长度**/
typedef struct {
   int data[MAXSIZE];
   int length;//声明的时候不能赋值
}SqList;

//初始化表.构造一个空的线性表
int initList(SqList *L);
//求表长.返回线性表L的长度,即L中数据元素的个数
int length(SqList L);
//按值查找操作.在表L中查找给定关键字值的元素
int locateElem(SqList L,int key);
//按位查找操作.获取表L中第i个位置的元素值
int GetElem(SqList L,int i);
//插入操作.在表L中的第i个位置上插入指定元素e
bool ListInsert(SqList *L,int i,int e);
//删除操作.删除表L中第i个位置的元素,并用e返回删除元素的值
bool ListDelete(SqList *L,int i,int* e);
//输出操作.按前后顺序输出线性表L中的所有元素值
void printList(SqList L);
//判空操作.若L为空表,则返回true,否则返回false
bool Empty(SqList L);
//销毁操作.销毁线性表,并释放线性表L所占用的内存空间
int DestoryList(SqList *L);

#endif

sqlist.c

#include "sqlist.h"

int initList(SqList *L)
{
   L->length = 0;	
   for(int i=0; i < 9 ; i++)
   {
      L->data[i] = (i+1)*10+i+1;
      L->length++;     
   }
};

int length(SqList L)
{
   return L.length;
}

int locateElem(SqList L,int key)
{
   for(int i=0;i<length(L);i++)
   {
      if(L.data[i] == key)
         return i+1; 	      
   }
   return 0;
}

bool ListInsert(SqList *L,int i,int e)
{
   if(i<1&&i>L->length+1)
   {
      printf("The value of i is error.\n");
      return false;
   }
   if(L->length >= MAXSIZE)
   {
      printf("L is nospace.\n");
      return false;      
   }
   for(int j=L->length ; j>1 ;j--)
   {
      L->data[j] = L->data[j-1];
      if(j == i-1)
      {
         L->length++;	      
         L->data[j] = e;
	 return true;
      }      
   }
   return true;
}

bool ListDelete(SqList *L,int i,int *e)
{
   if(i < 1 || i > L->length)
   {
      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;
}

void printList(SqList L)
{
  for(int i=0;i<L.length;i++)
  {
     if(i == L.length - 1)
     {
        printf("%d\n",L.data[i]);	     
     }
     else
     {
        printf("%d,",L.data[i]);
     }
  }	  
}
bool Empty(SqList L)
{
   if(L.length == 0)
   {
      return true;
   }
   else
   {
      return false;	   
   }   
}

main.c

#include "sqlist.h"

int main()
{
   SqList L1;
   SqList *L = &L1;
   initList(L);
   printList(L1);
   printf("The length of L is %d\n",length(L1));
   printf("66 randked %dth of list.\n",locateElem(L1,66));
   if(ListInsert(L,7,67) == true)
   {
      printf("insert success!\n");	   
   }
   else
   {
      printf("insert failed!\n");	  
   }
   printf("after of insert is ");
   printList(L1);
   int temp;
   int* e=&temp;
   if(ListDelete(L,7,e) == true)
   {
      printf("delete success! %d is deleted!\n",*e);
   }
   else
   {
      printf("delete failed!\n");	   
   }
   printList(L1);
   if(Empty(L1) == true)
   {
      printf("The sqlist is empty.\n");	   
   }
   else
   {
      printf("The sqlist is not empty.\n");	   
   }
   return 0;
};

2 线性表顺序存储章节大题

转载请标明出处: 点此此链接进入原著.

1. 从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。

答案:编译通过的下载压缩包链接如下:点此进行下载
其中包括了sqlist.h,sqlist.c,main_test_one.c,test_one.c四个文件,其中前三个文件主要是为了测试下面这个函数,这个函数即为答案(位于test_one.c中)(编译命令为gcc sqlist.c main_test_one.c sqlist.c)

int  test_one(SqList *L)
{
    if(L->length == 0)
    {
        return 0; //顺序表为空,直接出错返回
    }
    int value = L->data[0];
    int  i  =1 ;
    int pos = i;
    for (i ; i < L->length; i++)
    {
        if(value > L->data[i])
        {
            value = L->data[i];
            pos = i;
        }
    }
    L->data[pos] = L->data[L->length-1];
    return value;
}

2.设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)

答案:编译通过的下载压缩包链接如下:点此进行下载
压缩包中包括四个文件:test_two.c,sqlist.h,sqlist.c,main.c。其中test_three.c为该题的算法函数封装,其余main.c,sqlist.h,sqlist.c的存在是为了对test_two.c中算法进行测试。
test_two.c

#include "sqlist.h"
/**设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)**/
bool inversionList(SqList *L)
{
    int temp = 0;
    for (int i = 0; i < L->length / 2; i++)
    {
        temp = L->data[i ];
        L->data[i ] = L->data[L->length - i-1];
        L->data[L->length - i-1] = temp;
    }
    return true;
}

sqlist.h

#include <stdio.h>
#include <stdbool.h>
#ifndef __hello_h_
#define __hello_h_
#define MAXSIZE 100
/**固定长度**/
typedef struct {
   int data[MAXSIZE];
   int length;//声明的时候不能赋值
}SqList;
//构建第一个测试实例
int initListOne(SqList *L);
//构建第二个测试实例
int initListTwo(SqList *L);
//输出操作.按前后顺序输出线性表L中的所有元素值
void printList(SqList L);
#endif

sqlist.c

#include "sqlist.h"
int initListOne(SqList *L)
{
   L->length = 9;	
   L->data[0] = 77;
   L->data[1] = 66;
   L->data[2] = 88;
   L->data[3] = 55;
   L->data[4] = 99;
   L->data[5] = 11;
   L->data[6] = 44;
   L->data[7] = 22;
   L->data[8] = 33;
};
int initListTwo(SqList *L)
{
   L->length = 10;	
   L->data[0] = 100;
   L->data[1] = 101;
   L->data[2] = 102;
   L->data[3] = 103;
   L->data[4] = 104;
   L->data[5] = 105;
   L->data[6] = 106;
   L->data[7] = 107;
   L->data[8] = 108;
   L->data[9] = 109;
};
void printList(SqList L)
{
  for(int i=0;i<L.length;i++)
  {
     if(i == L.length - 1)
     {
        printf("%d\n",L.data[i]);	     
     }
     else
     {
        printf("%d,",L.data[i]);
     }
  }	  
}

main.c

#include "sqlist.h"
int main()
{
    SqList list1, list2;
    SqList *L1 = &list1, *L2 = &list2;
    printf("----------第一个测试实例为:");
    initListOne(L1);
    printList(list1);
    inversionList(L1);
    printf("经过逆置排序之后的顺序表为:");
    printList(list1);
    printf("----------第二个测试实例为:");
    initListTwo(L2);
    printList(list2);
    inversionList(L2);
    printf("经过逆置排序之后的顺序表为:");
    printList(list2);
    return 0;
}

转载请标明出处: 点此此链接进入原著

3.对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素

答案:编译通过的下载压缩包链接如下:点此进行下载
压缩包中包括四个文件:test_three.c,sqlist.h,sqlist.c,main.c。其中main.c为该题的算法函数封装,其余main.c,sqlist.h,sqlist.c的存在是为了对test_three.c中算法进行测试。(编译命令为gcc sqlist.c main_test_three.c sqlist.c)
这道题其实已经有些算法的意思在里边了,所以我大概说一下思路.变量temp是用来记录线性表L中与x不相等的元素的个数,然后相等的时候什么都不做,不相等的时候,temp加1,然后将这个数放到temp的位置上.其实可以这样子来想,有俩个线性表,其中第二个假想出来的线性表是下标是由temp来控制的

test_three.c

#include "sqlist.h"
bool deleteX(SqList *L, int x)
{
    if(L->length <= 0)
        return false;
    int temp = 0;
    for(int i=0; i<L->length;i++)
    {
        if(L->data[i] == x)
        {
            continue;
        }
        L->data[temp] = L->data[i];  
        temp++;      
    }
    L->length = temp;
}

运行截图
2.2.3
main.c

#include "sqlist.h"
int main()
{
    SqList sqlist1,sqlist2;
    SqList *L1 = &sqlist1,*L2 = &sqlist2;
    printf("第一个测试实例为:");
    initListOne(L1);
    printList(sqlist1);
    printf("删除线性表中所有值为2的数据元素\n");
    deleteX(L1,2);
    printList(sqlist1);
    printf("第二个测试实例为:");
    initListTwo(L2);
    printList(sqlist2);
    printf("删除线性表中所有值为2的数据元素\n");
    deleteX(L2,2);
    printList(sqlist2);
    return 0;
}

sqlsit.c

#include "sqlist.h"
int initListOne(SqList *L)
{
   L->length = 8;	
   L->data[0] = 1;
   L->data[1] = 2;
   L->data[2] = 3;
   L->data[3] = 2;
   L->data[4] = 4;
   L->data[5] = 2;
   L->data[6] = 5;
   L->data[7] = 2;
};
int initListTwo(SqList *L)
{
   L->length = 10;	
   L->data[0] = 1;
   L->data[1] = 2;
   L->data[2] = 3;
   L->data[3] = 2;
   L->data[4] = 2;
   L->data[5] = 2;
   L->data[6] = 4;
   L->data[7] = 2;
   L->data[8] = 2;
   L->data[9] = 5;
};
void printList(SqList L)
{
  for(int i=0;i<L.length;i++)
  {
     if(i == L.length - 1)
     {
        printf("%d\n",L.data[i]);	     
     }
     else
     {
        printf("%d,",L.data[i]);
     }
  }	  
}

sqlist.h

#include <stdio.h>
#include <stdbool.h>
#ifndef __hello_h_
#define __hello_h_
#define MAXSIZE 100
/**固定长度**/
typedef struct {
   int data[MAXSIZE];
   int length;//声明的时候不能赋值
}SqList;
//构建第一个测试实例
int initListOne(SqList *L);
//构建第二个测试实例
int initListTwo(SqList *L);
//输出操作.按前后顺序输出线性表L中的所有元素值
void printList(SqList L);
#endif

4.从有序顺序表中删除其值在给定值s与t之间(要求s小于t)的所有元素,如果s或t不合理或顺序表为空,则显示出错信息并退出运行

答案:编译通过的下载压缩包链接如下:点此进行下载
压缩包中包括四个文件:test_four.c,sqlist.h,sqlist.c,main.c。其中main.c为该题的算法函数封装,其余main.c,sqlist.h,sqlist.c的存在是为了对test_four.c中算法进行测试。(编译命令为gcc sqlist.c main.c test_four.c)
test_four.c

#include"sqlist.h"
bool  test_four(SqList *L,int s,int t)
{       
        //定义两个变量分别用来表示第一个大于给定值s的位置
        //大于t的第一个位置
        int begin = 0,end = 0;
        if(L->length == 0 || s>=t )
                return false;
        for(begin  ;  L->data[begin] <= s&&begin < L->length ; begin++);
        if(begin == L->length)
                return false;
        for(end = begin; L->data[end]  < t &&end<L->length; end++);
        for(;end<L->length;end++,begin++)
        {
                L->data[begin] = L->data[end];
        }
        L->length = begin;        
        return true;
}

运行截图:
2.2.4
main.c

#include "sqlist.h"
int main()
{
    SqList sqlist1,sqlist2;
    SqList *L1 = &sqlist1,*L2 = &sqlist2;
    printf("第一个测试实例为:");
    initListOne(L1);
    printList(sqlist1);
    printf("删除线性表中%d到%d之间的数据元素\n删除之后的测试实例为:",333,666);
    test_four(L1,333,666);
    printList(sqlist1);
    printf("第二个测试实例为:");
    initListTwo(L2);
    printList(sqlist2);
    printf("删除线性表中%d到%d之间的数据元素\n删除之后的测试实例为:",555,888);
    test_four(L2,555,888);
    printList(sqlist2);
    return 0;
}

sqlist.c

#include "sqlist.h"
int initListOne(SqList *L)
{
   L->length = 8;	
   L->data[0] = 111;
   L->data[1] = 222;
   L->data[2] = 333;
   L->data[3] = 444;
   L->data[4] = 555;
   L->data[5] = 666;
   L->data[6] = 777;
   L->data[7] = 888;
};
int initListTwo(SqList *L)
{
   L->length = 10;	
   L->data[0] = 111;
   L->data[1] = 222;
   L->data[2] = 333;
   L->data[3] = 444;
   L->data[4] = 555;
   L->data[5] = 666;
   L->data[6] = 777;
   L->data[7] = 888;
   L->data[8] = 999;
   L->data[9] = 1110;
};
void printList(SqList L)
{
  for(int i=0;i<L.length;i++)
  {
     if(i == L.length - 1)
     {
        printf("%d\n",L.data[i]);	     
     }
     else
     {
        printf("%d,",L.data[i]);
     }
  }	  
}

sqlist.h

#include <stdio.h>
#include <stdbool.h>
#ifndef __hello_h_
#define __hello_h_
#define MAXSIZE 100
/**固定长度**/
typedef struct {
   int data[MAXSIZE];
   int length;//声明的时候不能赋值
}SqList;
//构建第一个测试实例
int initListOne(SqList *L);
//构建第二个测试实例
int initListTwo(SqList *L);
//输出操作.按前后顺序输出线性表L中的所有元素值
void printList(SqList L);
bool test_four(SqList*L,int s,int t);
#endif

栈和队列

树和二叉树

查找

排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值