1. 程式人生 > >【資料結構週週練】001順序表與連結串列

【資料結構週週練】001順序表與連結串列

目錄

前言

1、題目

2、程式碼

1、題目

2、程式碼

1、題目

2、程式碼

前言

從這周開始,我會不定期發一些資料結構練習題,一方面,提升自己的程式設計能力,給自己考研程式碼題打基礎,雖然邏輯都明白,但是一次性寫對程式碼還是有問題,思維不細緻;另一方面,給想學習資料結構的同學提供一些程式設計的練習題,希望能對大家有所幫助。題目程式碼方式不唯一,歡迎大家提供新的解題思路或程式碼

一、練習1:刪除順序表指定部分元素

1、題目

從給定順序表中刪除i~j的所有元素(包括i,j)。以順序表:0123456789為例,i取3,j取6。

2、程式碼

#define MAXLISTSIZE 20
#define LISTINCREMENT 5
#define OVERFLOW -1

#include<iostream>
#include<malloc.h>

using namespace std;

typedef int ElemType;
typedef struct{
	ElemType *elem;
	int length;
	int listSize;
}SqList;

int InitSqList(SqList &S) {
	S.elem = (ElemType *)malloc(MAXLISTSIZE * sizeof(SqList));
	if (!S.elem)
	{
		return OVERFLOW;
	}
	S.length = 0;
	S.listSize = MAXLISTSIZE;
}

int CreatSqList(SqList &S) {
	for (int i = 0; i <= 9; i++)
	{
		if (S.length>S.listSize)
		{
			ElemType * newBase = (ElemType *)realloc(S.elem, (S.listSize + LISTINCREMENT) * sizeof(ElemType));//重新分配基地址
			S.elem = newBase;
			if (!S.elem)
			{
				return OVERFLOW;
			}
		}
		S.length++;
		S.elem[i] = i;
	}
	return 1;
}

int DeleteElem(SqList &S) {
	for (int i = 7; i <= S.length; i++)
	{
		S.elem[i-4] = S.elem[i];
	}
	S.length -= 4;
	return 1;
}

void VisitSqList(SqList S) {
	for (int i = 0; i < S.length; i++)
	{
		cout << S.elem[i] << ",";
	}
	cout << endl;
}
void main() {
	SqList S;
	InitSqList(S);
	CreatSqList(S);
	cout << "原順序表為:" << endl;
	VisitSqList(S);
	DeleteElem(S);
	cout << "刪除元素後順序表為:" << endl;
	VisitSqList(S);
}

3、執行結果

二、練習2:逆置連結串列

1、題目

建立一個長度為10的線性單鏈表:0123456789。並將其逆置,要求逆置過程不能創立新結點。

2、程式碼

#include<iostream>
#include<malloc.h>
using namespace std;

typedef int ElemType;

//建立連結串列
typedef struct LNode
{
	ElemType elem;
	struct LNode *next;
}LNode,*LinkList;


//初始化連結串列
int InitList(LinkList &L) {
	L = (LinkList)malloc(sizeof(LNode));
	
	if (!L)//儲存分配失敗
		exit(OVERFLOW);
	L->next = NULL;
	return 1;
}

//尾插法建立連結串列
int CreatList(LinkList &L) {
	L->elem = 0;
	LinkList p = L;
	LinkList q;
	for (int i = 1; i <= 9; i++)
	{
		q = (LinkList)malloc(sizeof(LNode));
		q->elem = i;
		q->next = NULL;
		p->next = q;
		p = q;
		q = p->next;
	}
	return 1;
}

//頭插法逆置連結串列
int HeadInsertList(LinkList &L) {
	LinkList p,q;
	p = L->next;
	q = p;
	L->next = NULL;
	while (q)
	{
		q = p->next;
		p->next = L;
		L = p;
		p = q;
	}
	return 1;
}

//遍歷連結串列,檢視逆置結果。
void VisitList(LinkList L) {
	LinkList p = L;
	while (p)
	{
		cout << p->elem << ",";
		p = p->next;
	}
	cout << endl;
}
void main() {
	LinkList L;
	InitList(L);
	CreatList(L);
	cout << "遍歷L:" << endl;
	VisitList(L);
	HeadInsertList(L);
	cout << "遍歷逆序後的L" << endl;
	VisitList(L);
}

3、執行結果

三、練習3:拆分連結串列

1、題目

將一個長度為10的線性單鏈表:0123456789中的偶數取出,放到另一個單鏈表中,要求保持原來順序。

2、程式碼

#include<iostream>
#include<malloc.h>
using namespace std;

typedef int ElemType;

//建立連結串列
typedef struct LNode
{
	ElemType elem;
	struct LNode *next;
}LNode, *LinkList;


//初始化連結串列
int InitList(LinkList &L) {
	L = (LinkList)malloc(sizeof(LNode));

	if (!L)//儲存分配失敗
		exit(OVERFLOW);
	L->next = NULL;
	return 1;
}

//尾插法建立連結串列
int CreatList(LinkList &L) {
	LinkList p = L;
	LinkList q;
	for (int i = 0; i <= 9; i++)
	{
		q = (LinkList)malloc(sizeof(LNode));
		q->elem = i;
		q->next = NULL;
		p->next = q;
		p = q;
		q = p->next;
	}
	return 1;
}
//分解連結串列
int ApartList(LinkList &L, LinkList &M) {
	LinkList p = L;
	LinkList q = L->next;
	LinkList m = M;
	while (q)
	{
		if (q->elem % 2 == 0)
		{
			p->next = q->next;
			p = q->next;
			m->next = q;			
			q->next = NULL;
			m = q;
		}
		q = p->next;
	}
	return 1;
}

void VisitList(LinkList &L) {
	LinkList p = L->next;
	while (p)
	{
		cout << p->elem << ",";
		p = p->next;
	}
	cout << endl;
}

void main() {
	LinkList L, M;
	InitList(L);
	CreatList(L);
	cout << "分解前的L連結串列為:";
	VisitList(L);
	InitList(M);
	ApartList(L, M);
	cout << "分解後的L連結串列為:";
	VisitList(L);
	cout << "分解後的M連結串列為:";
	VisitList(M);
}

3、執行結果