数据结构_实验报告1顺序表

  • 格式:doc
  • 大小:53.50 KB
  • 文档页数:5

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、抄写自己所选择的题目。

1、已知一顺序表A,其元素非递减有序排列,编写一个算法,删除顺序表中值相同多余的元素(相同值保留一个)。

2、已知带头结点的单链表L中的节点是按整数值递增排序的,试写一算法,将值为x的节点插入到表L中,使得表L仍然有序。分析算法的时间复杂度。

二、写出算法设计思路。

1.建立一个顺序表用于存储一组非递减排序的整形数据,对顺序表中的每个元素与其下一个元素进行比较操作。用指针记录当前所比较的元素,如果相等则对当前指针所指向的元素进行删除操作,并将它后面的数据前移,再与下一个元素比较,如果还相等就继续删除操作,否则指向下个元素,再比较直至无重复的元素。

2. 建立一个带头节点的单链表,其节点按整数值递增排序。创建一个新的节点,并由键盘输入节点的值。将其与链表中原有的节点(头节点不参与比较)按顺序作比较,并用指针指向当前的位置,若不大于当前节点,则在当前位置这前作插入操作,否则在最后作插入操作。

三、编写代码,调试运行,实现题目要求(提示:考虑到插入和删除的位置是否超出范围等可能出现的异常问题)。解1.法I:

#include "stdio.h"

#include "conio.h"

#define SIZE 10

main()

{ int SqList_A[SIZE]={23,3,45,65,23,44,5,7,89,0};

int i,j,n,m,l=SIZE;

for(i=0;i

printf("\nThe new one is:\n");

for(i=0;i<(l-1);i++)

for(j=0;j<(l-1);j++)

if(SqList_A[i]==SqList_A[j])

if(i!=j)

{n=i;m=i+1;

for(;m

SqList_A[n]=SqList_A[m];

l=l-1; }

for(i=0;i

getch();

}

法II:

#include "stdio.h"

#include "conio.h"

#define SIZE 18

#define ERROR 0

#define OK 1

int length; /* 定义宏观变量*/

typedef int status;

typedef struct{

int *elem;

int length;

int listsize;} SqList;

status ListDelete(SqList *L)

{ /*删除顺序表L中值相同多余的元素(相同值保留一个)*/

int i=0,j,n=0;

SqList *p=L;

if(!p) return ERROR;

while(ilength)

{if(*(p->elem+i)==*(p->elem+i+1))

{/*删除相同多余的元素*/

for(j=i;jlength;j++) *(p->elem+j)=*(p->elem+j+1);

n++;

p->length--;}

if(!(*(p->elem+i)==*(p->elem+i+1)))

/*判断第i个数是否任和下一个数相同*/

i++;}

length=SIZE-n;

return n;}

main()

{int a[SIZE]={1,2,2,5,6,7,7,12,13,13,13,18,19,20,21,24,24,39},t; int n,m;

SqList A;

A.elem=a;

for(n=0;n

printf("%d ",a[n]);

A.length=A.listsize=SIZE;

t=ListDelete(&A) ;

if(!t)printf("ListDelete ERROR!\n");

else

{

printf("\nThe new one is:\n");

for(n=0;n

printf("%d ",a[n]);}

getch();

}

解2.

#include "stdio.h"

#include "conio.h"

#define SIZE 10

#define ERROR 0

#define NULL 0

#define OK 1

int a[SIZE]={1,3,5,8,10,12,14,17,19,26},i;

typedef int status;

typedef struct nod{

int data;

struct nod *next;} node;

status CreatList(node *L)

{/*建立一个带头结点的节点按整数值递增排序的单链表L*/

node *p,*h=NULL;

h=p=(node *)malloc(sizeof(node));

if(!p) return ERROR; /*节点创建失败*/

p->data=a[i];

for(i=1;i

{p->next=(node *)malloc(sizeof(node));

p=p->next;

p->data=a[i];}

p->next=NULL;

L->next=h;

return OK;}

status ListInsert(node *L,int x)

{int i,k;

for(i=0;i=a[i]&&x

{for(i=SIZE-1;i>=k;i--) a[i+1]=a[i]; a[k]=x;} }

main()

{node *L,*p;

int t,x,i,k;

printf("Please input the number you want to insert x:\n"); scanf("%d",&x);

printf("The List is:\n");

for(i=0;i

printf("%d ",a[i]);

printf("\nAfter inert,the new one is:\n");

L=(node *)malloc(sizeof(node));

if(!L){ printf("ERROR!\n");return;}

t=CreatList(L); /*创建链表*/

if(!t){ printf("ERROR!\n");return;}

ListInsert(L,x);

for(i=0;i

printf("%d ",a[i]);