1. 程式人生 > >串的鏈式表示和實現

串的鏈式表示和實現

用連結串列的方法來寫串真的是太麻煩了(下回更新一個用動態陣列寫的)。

下面是我簡單實現的鏈式串的幾個功能,沒辦法,資料結構老師不給程式碼,這些完全是我自己想的。

應該沒什麼邏輯上的錯誤,如有發現還請提出來。

#include <iostream>
#include <cstring>
using namespace std;
const int SIZE = 80 + 7;

typedef struct Chunk{
	char ch[SIZE];			// 結點型別和大小
	struct Chunk *next;
} Chunk;
typedef struct {
	Chunk *head, *tail;	// 串的頭指標和尾指標
	int curlen;			// 串的長度
} LString;

bool StrInit(LString &S)
{
	S.head = NULL;
	S.head = new Chunk;	// 初始分配第一個節點
	S.tail = S.head;
	S.tail->next = NULL;
	if( !S.head)
		return false;
	else
		return true;
}

bool StrAssign(LString &S, Chunk *s2)
{
	LString s1, tmp;
	s1.head = S.head->next;
	while(s1.head != NULL)				// 如果是賦值就刪除除出第一個結點外的所有節點
	{
		tmp.head = s1.head;
		s1.head = s1.head->next;
		delete tmp.head;
	}
	strcpy(S.head->ch, s2->ch);		// 賦值到頭結點
	return true;
}

bool StrDelete(LString &S);
bool StrCopy(LString &s1, const LString &s2)
{
	StrDelete(s1);		// 先將第一個串清空成空串
	s1.curlen = s2.curlen;	// 先複製長度值
	LString i = s2;
	while(i.head != NULL)	// 以此可以訪問到s2中所有的結點
	{
		Chunk *tmp = new Chunk;	// 新定義一個結點,並分配空間
		strcpy(tmp->ch, i.head->ch);
		tmp->next = i.head->next;
		if(i.head == NULL)			// 如果頭結點為空
		{
			s1.head = tmp;
			s1.tail = tmp;
		}
		else
		{
			s1.tail->next = tmp;		// 插入在尾結點的後面
			s1.tail = s1.tail->next;	// 尾指標後移
		}
		i.head = i.head->next;	// i後移到下一個節點
	}
}
bool StrDelete(LString &S)	// 刪除所有節點,使稱為空串
{
	LString tmp;
	while(S.head != NULL)
	{
		tmp.head = S.head;
		S.head = S.head->next;
		delete tmp.head;
	}
	S.tail = S.head;		// 都置位空
	return true;
}

bool StrSwap(LString &s1, LString &s2)	// 交換兩個串
{
	LString tmp;
	tmp = s1;
	s1 = s2;
	s2 = tmp;
	return true;
}
int StrSize(const LString &S)
{
	return S.curlen;		// 返回的是結點的個數
}

int main()
{
	LString S;
	StrInit(S);
	cin >> S.head->ch;
	cout << S.head->ch;


	return 0;
}