为了更好地学习数据结构,方便自己复习反思,特建立此分类进行课后习题的总结,通过总结来督促自己学习与反思,提升水平,一步步找出更好的算法。
1.将一元素插入一个有序的顺序表中,使其仍然有序,写出能够实现此算法的代码。
我的思路是将元素先插入表尾,之后再进行插入排序,代码如下:
#include<stdio.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define maxsize 20
typedef int status;
typedef int elemtype;
typedef struct
{
elemtype data[maxsize];
int length;
}sqlist;
status visit(elemtype c)
{
printf("%d ",c);
return OK;
}
status initlist(sqlist *l)
{
l->length=0;
return OK;
}
status insertlist(sqlist *l,elemtype e,int i)
{
int k;
if(l->length==maxsize)
return ERROR;
if(i<1||i>l->length+1)
return ERROR;
if(i<=l->length)
for(k=l->length-1;k>=i-1;k--)
l->data[k+1]=l->data[k];
l->data[i-1]=e;
l->length++;
return OK;
}
status listtraverse(sqlist l)
{
int i;
for(i=0;i<l.length;i++)
{
visit(l.data[i]);
}
putchar('\n');
return OK;
}
status insertsort(sqlist *l){
int i,j,temp;
for(i=1;i<l->length;i++){
if(l->data[i]<l->data[i-1]){
temp=l->data[i];
for(j=i-1;j>=0&&l->data[j]>temp;j--){
l->data[j+1]=l->data[j];
}
l->data[j+1]=temp;
}
}
}
int main(void){
sqlist L;
int i=0;
initlist(&L);
for(i=0;i<10;i++){
insertlist(&L,i,i);
}
listtraverse(L);
int insert=5;
insertlist(&L,insert,L.length+1);
listtraverse(L);
insertsort(&L);
listtraverse(L);
}
2.删除一个顺序表中的重复元素
我的思路是使用i,j两个索引,其中i从0开始,j从i+1开始,遍历整个顺序表,当有两元素相等时,删除其中一个即可。
#include<stdio.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0