数据结构上机作业答案
- 格式:doc
- 大小:80.50 KB
- 文档页数:7
数据结构作业2012
作业1. 线性表
编程作业:
1. 将顺序表逆置,要求用最少的附加空间。
参考答案
#include
#include
#include
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct
{ ElemType *elem;
int length;
int listsize;
}SqList;
//创建空顺序表
Status InitList_Sq( SqList &L )
{
L.elem = (ElemType*) malloc (LIST_INIT_SIZE*sizeof(ElemType));
if (!L.elem)
exit(OVERFLOW);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}
//顺序表在第i个元素之前插入e
Status ListInsert_Sq( SqList &L, int i, ElemType e)
{ ElemType *newbase,*q,*p;
if(i<1 || i>L.length+1) //插入位置非法
return ERROR;
if(L.length>=L.listsize)//溢出,动态追加空间
{ newbase= (ElemType *)realloc(L.elem, (L.listsize+ LISTINCREMENT) *sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;p--) //元素后移
*(p+1)=*p;
*q=e; //完成元素插入
++L.length;
return(OK);
}
数据结构作业2012
//顺序表遍历显示
Status ListTraverse_Sq(SqList L)
{ int i=0;
if(!L.elem)
return ERROR;
while(i
printf("%d ",L.elem[i++]);
printf("\n");
return OK;
}
//顺序表逆置
void Reverse_Sq(SqList &L)
{
int i,j;
ElemType temp;
for(i=0,j=L.length-1; i
{
temp=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j]=temp;
}
}
void main()
{
SqList L;
char flag;
int i;
ElemType e;
if(InitList_Sq(L)==OK)
{
printf("建立空顺序表成功!\n");
do{
printf("当前线性表长度为:%d\n",L.length);
printf("请输入要插入元素的位置:");
scanf("%d",&i);
printf("请输入要插入的元素值:");
scanf("%d",&e);
if(ListInsert_Sq(L,i,e)==OK)
{
printf("插入成功,插入后顺序表长度为:%d\n",L.length);
printf("插入后的顺序表为:");
ListTraverse_Sq(L);
}
else
printf("插入失败");
printf("\n继续插入元素?(y/n) ");
fflush(stdin);
scanf("%c",&flag);
}while(flag=='y');
Reverse_Sq(L);
printf("顺序表逆置后为:\n");
ListTraverse_Sq(L);
}
else
printf("顺序表初始化失败!\n");
} 数据结构作业2012
2. 从键盘读入n个整数(升序),请编写算法实现:
(1) CreateList():建立带表头结点的单链表;
(2) PrintList():显示单链表,(形如:H->10->20->30->40);
(3) InsertList():在有序单链表中插入元素x;
(4) ReverseList():单链表就地逆置;
(5) DelList():在有序单链表中删除所有值大于mink且小于maxk的元素。
选作:使用文本菜单完成功能选择及执行。
参考答案:
#include
#include
#include
typedef int ElemType;
typedef struct LNode
{ ElemType data;
struct LNode *next;
}LNode, *LinkList;
//尾插法建立单链表,按升序顺序输入n个元素的值,建立带头结点的有序单链表L
void CreateList_L (LinkList &L,int n)
{ LNode *p,*rear;
int i;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
rear=L;
printf("输入%d个升序数据:",n);
for(i=0;i
{ p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=NULL;
rear->next=p;
rear=p;
}
}
//显示单链表中元素
void ListTraverse_L(LinkList L)
{ LNode * p;
p=L->next;
while(p)
{ printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//删除大于等于mink且小于maxk的元素
void ListDelete_L(LinkList &L, ElemType mink, ElemType maxk)
{
LinkList p=L,q; 数据结构作业2012
while(p->next && p->next->data
p=p->next;
q=p;
while(q && q->data
q=q->next;
p->next=q;
}
//单链表就地逆置
void ListReverse_L(LinkList &L)
{
LinkList p,q,u;
p=L->next;
if(p==NULL) //空链表
return;
q=L->next->next; //q指向第一个结点
p->next=NULL;
while(q)
{
u=q->next;
q->next=L->next;
L->next=q;
q=u;
}
}
//有序表插入
void ListInsert_L(LinkList &L, ElemType e)
{
LinkList pre,p,s;
pre=L;
p=L->next;
while(p&&p->data
{
pre=p;
p=p->next;
}
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p;
pre->next=s;
}
void main()
{
LinkList L;
int n,choice;
ElemType e,mink,maxk;
do
{
printf("\n********************************\n");
printf("1.建立有序单链表\n");
printf("2.显示单链表\n");
printf("3.有序单链表插入\n");
printf("4.删除大于等于mink且小于maxk的元素值\n");
printf("5.就地逆置\n");
printf("0.退出\n");
printf("\n\n请选择操作:");