1. 程式人生 > >資料結構(連結串列的實現)

資料結構(連結串列的實現)

1.連結串列的實現:插入結點,想要動態分配記憶體,如果分配的記憶體為空,則記憶體分配失敗。

2.序號查詢:for迴圈查詢,關鍵字查詢:while迴圈

3.連結串列的缺點就是不管查詢,刪除都是的從頭結點開始遍歷。

4.如果資料項只有一個,則只用一個結構體,如果資料項有多個,則要定義兩個結構體。

#include<iostream>
#include<string>
using namespace std;

struct Data {
	string key;
	string name;
	int age;
};

typedef struct Node {
	struct Data data;
	struct Node *next;
}LNode,*LinkList;
//建立單鏈表:頭插法和尾插法
//分配記憶體空間 ,頭指標為null
LinkList CreateList1(LinkList head, Data std)
{
	LinkList node;
	if (!(node = new LNode))
	{
		cout << "記憶體分配失敗!" << endl;
		return 0;
	}
	else
	{
		node->data = std;
		node->next = head;
		head = node;
		return head;
	}
}

LinkList CreataList2(LinkList head, Data std)
{
	LinkList node, test;
	if (!(node = new LNode))
	{
		cout << "記憶體分配失敗!" << endl;
		return 0;
	}
	else
	{
		node->data = std;
		node->next = NULL;
		if (head == NULL)
		{
			head = node;
			return head;
		}
		
		else
		{
			test = head;
			while ((test->next) != NULL)
			{
				test = test->next;
			}
			test->next = node;
			return head;

		}
	}
}

LinkList FindList1(LinkList head, int k)
{
	LinkList test;
	test = head;
	for (int i = 1; i < k&&test; ++i)
	{
		test = test->next;
	}
	return test;
}

LinkList FindList2(LinkList head,string name )  //以name為例
{
	LinkList test;
	test = head;
	while (test)
	{
		if (test->data.name == name)
		{
			return test;
		}
		test = test->next;
	}
	return NULL;
}

LinkList InsertList(LinkList head, int k, Data data)
{
	LinkList test,exam;
	if (!(test = new(LNode)))
	{
		cout << "分配記憶體失敗!" << endl;
	}
	else
	{
		test->data = data;
		exam = FindList1(head, k - 1);
		if (exam)
		{
			test->next = exam->next;
			exam->next = test;
		}
		else
		{
			cout << "沒有找到插入的位置!" << endl;
			delete test;
		}
	}
	return head;
}

LinkList DeleteList1(LinkList head, int k)
{
	LinkList a, b;
	a = FindList1(head, k - 1);
	b = FindList1(head, k);
	a->next = b->next;
	return head;
}

LinkList DeleteList2(LinkList head, string name)
{
	LinkList test, exam;
	test = FindList2(head, name);
	if (test)
		delete test;
	else
		return 0;

}

int LenList(LinkList head)
{
	LinkList test;
	int len=0;
	test = head;
	while (test)
	{
		++len;
		test = test->next;
	}return len;
}

void DisplayList(LinkList head)
{
	LinkList test;
	test = head;
	while (test)
	{
		cout << test->data.key <<"\t"<< test->data.name << "\t" << test->data.age << endl;
		test = test->next;
	}
}
int main()
{
	LinkList lis, head = NULL;
	Data data;
	string name;
	cout << "請先輸入連結串列中的資料,格式為:學號,姓名,年齡(年齡為0時停止輸入)" << endl;
	while (1)
	{
		cin >> data.key >> data.name >> data.age;
		if (data.age == 0)
		{
			break;
		}
		head =CreateList1(head, data);
	}
	DisplayList(head);
	//等等呼叫函式的操作,再不一一列舉。
	
	
	system("pause");
	return 0;
}