数据结构练习题(顺序表和单链表)C++

1、
编程实现顺序表的各种基本运算,并在此基础上设计一个主程序,完成如下功能:
(1)初始化顺序表;
(2)给定一个整型数据元素,将此元素插入到顺序表的第i个位置;
(3)删除顺序表中第i个位置的元素,利用e返回被删除的元素。

#include <stdio.h>
#include <stdlib.h>

#define OK   1
#define ERROR   0
#define OVERFLOW   -2
typedef  int  ElemType;
typedef  int  Status;

//----- 顺序表的顺序存储表示 -----
#define LIST_INIT_SIZE 100 // 存储空间的初始分配量
#define LISTINCREMENT 10 // 存储空间的分配增量
typedef struct {
	ElemType	*elem;	// 存储空间的基址
            int length; // 表长
            int size;// 存储容量
	int increment; // 扩容时,增加的存储容量
} SqList;  //顺序表 

// 构造一个顺序表 
Status InitSqlist(SqList &L){
	L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
	if(!L.elem) exit (OVERFLOW);
	L.length = 0;
	L.size = LIST_INIT_SIZE;
	L.increment = LISTINCREMENT;
	return OK;
}
// 判顺序表是否为空表 
Status ListEmpty(SqList L){
	if (L.length==0) return OK;
	else return ERROR;
}
//顺序表插入函数
Status ListInsert_Sq(SqList &L, int i ,ElemType e){ 
//请在此填写代码,将该算法补充完整,参见课本和课件相关章节  
int j;
   if (i<1 || i>L.length+1)
      return false;		
   i--;				
   for (j=L.length;j>i;j--)	
	L.elem[j]=L.elem[j-1];
   L.elem[i]=e;		
   L.length++;			
   return true;			

}


//顺序表删除元素函数
Status ListDelete_Sq(SqList &L, int i, ElemType  &e){
//请在此填写代码,将该算法补充完整,参见课本和课件相关章节
	int j;
   if(i<1||i>L.length)
   return false;
   i--;				
   e=L.elem[i];
   for (j=i;j<L.length-1;j++)  	
	L.elem[j]=L.elem[j+1];
   L.length--;			
   return true;
}

//输出顺序表函数
void OutList_Sq(SqList L)
{	int i;
    ElemType  e;
	if(ListEmpty(L)){
		printf("这是一个空表!");
	}
	else
	{ 
	 printf("顺序表为:");
	 for(i=0;i<L.length;i++)
	    printf("%6d",L.elem[i]);
	}
	printf("\n");
}
//主函数
int main()
{ SqList L;
	int cord,i; ElemType a;
	printf(" 姓名:蔡旭胜 \n 学号:2050414821 \n 班级:软件设计11班"); 
	printf("第一次使用必须初始化!\n");
	do{
		printf("\n 主菜单 \n");
		printf(" 1 初始化顺序表 ");
		printf(" 2 插入一个元素 ");
		printf(" 3 删除一个元素 ");
		printf(" 4 结束程序运行 ");
		printf("\n-------------------------------------------------------------------\n");
		printf("请输入您的选择( 1, 2, 3, 4)");
		scanf("%d",&cord);
		printf("\n");
		switch(cord){
		case 1:
			InitSqlist(L);
			OutList_Sq(L);
			break;
		case 2:
			printf("\n请输入要插入的插入位置和数据元素(如:3 20)");
			scanf("%d%d",&i,&a);
			ListInsert_Sq(L,i,a);
			printf("\n插入%d元素之后的",a);
			OutList_Sq(L);
			break;
		case 3:
			printf("\n请输入要删除的数据元素的位置(如: 3)");
			scanf("%d",&i);
			ListDelete_Sq(L,i,a);
			printf("\n删除第%d个位置的元素之后",i);
			OutList_Sq(L);
			break;
		case 4:
			exit(0);
}
}while (cord<=4);
return 1;
} 

2、
编程实现建立一个单链表,并在此表中插入一个元素和删除一个元素
(1)通过键盘读取元素建立单链表;
(2)指定一个位置,在此位置之前插入一个新元素;
(3)指定一个位置,删除此位置元素。

#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0

typedef int ElemType;
typedef int Status;
typedef struct Lnode {
   ElemType data;
   struct Lnode *next;
}Lnode,*LinkList;

//以下是建立单链表
void CreatList_L(LinkList &head)
{	LinkList tail, p;
	int n,i;
	p=(Lnode *)malloc(sizeof(Lnode));
	head=tail=p;
	head->next=NULL;
	printf("\n请输入链表的长度:");
	scanf("%d", &n);
	printf("\n请输入%d个整型数据元素",n);
	for(i=1;i<=n;i++){
		p= (Lnode *)malloc(sizeof(Lnode));
		scanf("%d", &p->data);
		p->next=NULL;
		tail->next=p;
		tail=p;
	}
	printf("\n单链表的建立成功!");
}
 
//以下是输出单链表
void OutputList_L(LinkList L){
	LinkList p = L->next;
	if(p==NULL){
	printf("是一个空表!\n");
	return;
	}
	printf("单链表是:");
	while (p ) {
	printf("%4d",p->data);
	p = p->next;
	}
	printf("\n");
}


      //在第 i 个元素之前插入一个元素
Status ListInsert_L(LinkList L, int i, ElemType e) {
	LinkList p,s;
	p=L;
	int j=0;
	for(j=0;j<i;j++)
	{
		p=p->next;
	} 
	s= (Lnode *)malloc(sizeof(Lnode));
	s->data=e;
	 s->next=p->next;
	 p->next=s; 
	//请在此填写代码,将该算法补充完整,参见课本和课件相关章节  
	return OK;
}

// 删除第 i 个元素
Status ListDelete_L(LinkList L, int i, ElemType &e) {
	LinkList p,q;
	p=L;
	q=L;
	int j=0;
	for(j=0;j<i-1;j++) 
	{
		p=p->next;
		q=q->next;
	} 
	q= q->next;
	e=q->data;
	p->next=p->next->next; 
 //请在此填写代码,将该算法补充完整,参见课本和课件相关章节  
	return OK;
}


int main()
{ LinkList L;
   int cord,i; ElemType a;
   printf(" 姓名:蔡旭胜 \n 学号:2050414821 \n 班级:软件设计11班"); 
	printf("\n 您是第一次使用请先创建一个单链表!\n");
	do{
		printf("\n 主菜单 \n");
		printf(" 1 创建一个单链表 ");
		printf(" 2 插入一个元素 ");
		printf(" 3 删除一个元素 ");
		printf(" 4 结束程序运行 ");
		printf("\n-------------------------------------------------------------------\n");
		printf("请输入您的选择( 1, 2, 3, 4)");
		scanf("%d",&cord);
		printf("\n");
		switch(cord){
		case 1:
			CreatList_L(L);
	        OutputList_L(L);
			break;
		case 2:
			printf("\n请输入要插入的插入位置和数据元素(如:3 20)");
			scanf("%d%d",&i,&a);
			
			if(ListInsert_L(L,i,a))
			{
               printf("\n插入元素成功!插入%d元素之后的",a);
               OutputList_L(L);
			   }
            else printf("插入元素失败!\n");
			break;
		case 3:
			printf("\n请输入要删除的数据元素的位置(如: 3)");
			scanf("%d",&i);
			if(ListDelete_L(L,i,a))
			{
			printf("\n删除元素成功!被删除的元素是 %d\n",a);
			printf("\n删除第%d个位置的元素之后",i);
			OutputList_L(L);
			}
			else printf("删除位置错误,请重新执行!\n");
			break;
		case 4:
			exit(0);
}
}while (cord<=4);
return 1;
}

来自课下作业

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值