2019下学年数据结构作业

欢迎大家留言评论哦!
对于其中存在的诸多问题,还请大佬不吝赐教!!!
如果读者觉得对有帮助,希望可以点个赞鼓励一下作者小菜鸟啦。

运行环境Visual C++6.0

1、第二次

(1)、创建一个单链表,当输入-1时表示输入结束。

拓展:带头结点与不带头结点时,删除代码的区别
(1)、个人理解,当第一个结点数据域不含元素时,则含有头结点,否则不含

#include <iostream.h>
#include <stdlib.h>
struct list
{ 
	int data;
	struct list *next;
};
//可能是以下函数有错误,导致无法输出
struct list *creatlist()  //创建一个带头结点的单向链表,链表结点中的数据通过键盘输入,当输入数据为-1时,表示输入结束。
{//为什么加*?
	list *L;
	L = (list *)malloc(sizeof(list));
	L->next = NULL;	L->data = NULL;//创建一个带头节点的单向链表,并且设置头结点指针的数据域为空
	list *r,*p;	
	r = L;//尾指针 r 指向头结点
	int i;
	do
	{
	p = (list *)malloc(sizeof(list));//生成一个新的节点
	cin>>i;//输入p->data
	if(i == -1) break;
	p->data = i;
	p->next = NULL; r->next = p; r = p;//将新节点*p插入尾节点*r 之后
	}while(1);
	return L;
}
void print(list *L)  //打印链表
{
  list *p;
  p = L->next;	//p = L;当头结点的指针域不为空时,即没有头结点时,可以写这个
  while(p != NULL)
  {		cout<<p->data<<'\t';	p = p->next;	}
  cout<<endl;
}

void Comput(list *L)  //求其数据域的总和与平均值
{
	int sum = 0;
	list *p; p = L->next;
	while(p != 0)
	{	sum += p->data;	p = p->next; }
	cout<<"数据域的总和:"<<endl;
	cout<<sum<<endl;
}

void main()     
{
	struct list *head;
	head=creatlist();
	print(head);
	Comput(head);
}

(2)、将两个顺序表合并(包含顺序表的创建、查找、插入、合并函数)

问题: 如下,在while循环语句中,将 *p++ 改为 ++*p 将会发生报错??? (希望路过的大佬可以满足一下小菜鸟的求知欲)
在这里插入图片描述

#include<iostream.h>
#include<string.h>
 #include<ctype.h>
 #include<malloc.h> /* malloc()等 */
 #include<limits.h> /* INT_MAX等 */
 #include<stdio.h> /* EOF(=^Z或F6),NULL */
 #include<stdlib.h> /* atoi() */
 #include<io.h> /* eof() */
 #include<math.h> /* floor(),ceil(),abs() */
 #include<process.h> /* exit() */
 /* 函数结果状态代码 */
 #define TRUE 1
 #define FALSE 0
 #define OK 1
 #define ERROR 0
 #define INFEASIBLE -1
#define LIST_INIT_SIZE 10 /* 线性表存储空间的初始分配量 */
 #define LIST_INCREMENT 2 /* 线性表存储空间的分配增量 */
 /* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */
 typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
 typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
 typedef int ElemType;
 typedef struct
 {
   ElemType *elem; /* 存储空间基址 */
   int length; /* 当前长度 */
   int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */
 }SqList;
 int InitList(SqList &L) /* 算法2.3 */
	 //线性表的动态分配顺序存储结构
 {
	L.elem = (ElemType *)malloc(LIST_INIT_SIZE *sizeof(ElemType));
	if(!L.elem)exit(OVERFLOW);//存储分配失败
	L.length = 0;//空表长度为0
	L.listsize = LIST_INIT_SIZE;//初始存储容量
	return OK;
 }


 Status ListInsert(SqList &L,int i,ElemType e) /* 算法2.4 */
 //在顺序线性表L中第i个位置之前插入新的元素e
 //可插入位置I的值为1<=i<=ListLength.Sq(L)+1
 {
	ElemType *newbase,*p,*q;
	if(i<1 || i>L.length+1) return ERROR;//i的值不合法
	if(L.length >= L.listsize){//当前储存空间已满,增加分配
	newbase = (ElemType *)realloc(L.elem,(L.listsize + LIST_INCREMENT)*sizeof(ElemType));
	if(!newbase)exit(OVERFLOW);//存储分配失败
	L.elem = newbase;
	L.listsize += LIST_INCREMENT;
	}
	q = &(L.elem[i-1]);//q为插入的位置,数据元素L.elem[i-1]的位置为第I个位置
	for(p = &(L.elem[L.length-1]);p>=q;--p) *(p+1) = *p;//插入位置元素向后移
	*q = e;//插入e 
	++L.length;//表长增1
	return OK;
 }

int LocateElem_Sq(SqList L, ElemType e)/* 算法2.6 */
//在顺序线性表L中查找第1个值与e满足compare()的元素的位序
{
   ElemType i,*p;
   i = 0;//i的初值为第1个元素的位序
   p = L.elem;//p的初值为第1个元素的存储位置既a[0]
   while( i < L.length && ( *p<e ))
   {	i++;	*p++;	}//在这边如果使用++*p将会输出错误???
   //cout<<i+1<<endl;
   if(e>L.elem[L.length-1])return L.length+1;
   return i+1;

} // LocateElem_Sq


void Union(SqList &La,SqList Lb) /* 算法2.1 */
//存在于LB中但不存在于LA中的数据元素插入到线性表LA中去。
 {  
	ElemType Lb_len,i,j;
	Lb_len = Lb.length;
	for(i=0;i<Lb_len;i++)
		for(j=0;j<La.length;j++)
		{
			if(La.elem[j] == Lb.elem[i]) break;
			if(j == La.length-1)
			{
				ListInsert(La,LocateElem_Sq(La,Lb.elem[i]),Lb.elem[i]);break;
			}
		}
  }
	
 void print(SqList L)/* 打印顺序表 */
 {
	 ElemType i,*p;	p=L.elem;
	 for(i=0;i<L.length;i++)
	 { cout<<*(p+i)<<'\t';}
	 cout<<endl;
 }

 void main()
 {
   SqList La,Lb;
   int j,a[4]={3,5,8,11},b[7]={2,6,8,9,11,15,20};
   InitList(La); /* 创建空表La */
   for(j=1;j<=4;j++) /* 在表La中插入4个元素 */
     ListInsert(La,j,a[j-1]);
   cout<<"La= "; /* 输出表La的内容 */
   print(La);
   InitList(Lb); /* 创建空表Lb */
   for(j=1;j<=7;j++) /* 在表Lb中插入7个元素 */
     ListInsert(Lb,j,b[j-1]);
   cout<<"Lb= "; /* 输出表Lb的内容 */
   print(Lb);
   Union(La,Lb);
   cout<<"after : La= "; /* 输出表La的内容 */
   print(La);
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值