2020王道课后习题P18,综合应用题6:从顺序表中删除所有重复的元素。

2020王道课后习题P18,综合应用题6:从顺序表中删除所有重复的元素,此题要稍加思考,这次为了能够调试,采用了VS2013写的代码,有点不一样,但是很好用,因为之前C#写习惯了,还是看代码吧:

// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include
#include
#include
#define InitSize 100
typedef int ElemType;
typedef struct{
	ElemType *data;
	int length,Maxsize;
}SeqList;

//插入操作
bool ListInsert(SeqList &L, int i, ElemType e){
	if(i<1||i>L.length+1)
	    return false;
	if(L.length>L.Maxsize)
		return false;
	for (int j = L.length; j >= i; j++)
		L.data[j] = L.data[j - 1];
	L.data[i - 1] = e;
	L.length++;
	return true;
}

bool Delete_Same(SeqList &L){
	if (L.length == 0)
		return false;
	int i, j,k=1;
	for (i = 0, j = 1; j < L.length; j++){
		if (L.data[i] != L.data[j]){
			L.data[++i] = L.data[j];
			k++;
		}
	}
	L.length = k;
	return true;
}

int _tmain(int argc, _TCHAR* argv[])
{
	SeqList L;
	ElemType e;
	L.data = new ElemType[InitSize];
	L.length = 0;
	L.Maxsize = 100;
	int x[11] = { 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5 };
	for (int i = 0; i<11; i++){
		ListInsert(L, i + 1, x[i]);
	}
	printf("生成前顺序表:");
	for (int m = 0; m

当然,答案提供了更好的方法,空间复杂度稍微降低,所以把答案的也附上吧:

bool Delete_Same(SeqList &L){
	if (L.length == 0)
		return false;
	int i, j;
	for (i = 0, j = 1; j < L.length; j++)
		if (L.data[i] != L.data[j])
			L.data[++i] = L.data[j];
	L.length = i + 1;
	return true;
}

当然他的更好啊,用了一组数:1,2,2,2,2,3,3,3,4,4,5来测试,效果如下:

你可能感兴趣的:(C语言,2020王道课后习题)