欢迎大家留言评论哦!
对于其中存在的诸多问题,还请大佬不吝赐教!!!
如果读者觉得对有帮助,希望可以点个赞鼓励一下作者小菜鸟啦。
文章目录
运行环境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);
}