單鏈表相關的基本操作(從文件中讀入)

單鏈表相關的基本操作

  1. 初始化單鏈表
  2. 頭插法建表
  3. 尾插法建表
  4. 插入元素
  5. 刪除元素
  6. 判空表
  7. 單鏈表倒置

頭文件:

#ifndef _LINKLIST_H_
#define _LINKLIST_H_

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

#define OK 1
#define ERROR 0

typedef int Status;
typedef int ELEMTYPE; 
typedef struct LNode
{
	ELEMTYPE data;  //數據域
	struct LNode *next;  //指針域
}LNode,*LinkList;

Status initLinkList(LinkList &L) //帶頭結點
{
	L = new LNode;
	if (!L)  //如果沒有申請到空間
	{
		cout << "空間不足" << endl;
		return ERROR;
	}
	L->next = NULL;
}

Status CreateLinkList_head(LinkList &L) //頭插法
{
	fstream file;
	file.open("data.txt",ios::in);
	if(!file)
	{
		cout << "打開文件失敗\n";
		return ERROR;
	}
	while (!file.eof())
	{
		LNode *p = new LNode;
		file >> p->data;
		p->next = L->next;
		L->next = p;
	}
}

Status CreateLinkList_rear(LinkList &L) //尾插法
{
	fstream file;
	file.open("data.txt",ios::in);
	if(!file)
	{
		cout << "打開文件失敗\n";
		return ERROR;
	}
	LNode *rear = L;  //尾指針
	while (!file.eof())
	{
		LNode *p = new LNode;
		file >> p->data;
		p->next = NULL;
		rear->next = p;
		rear = p;
	}
}

bool isEmpty(LinkList L)  //判空
{
	if (L->next == NULL)
		return true;
	return false;
}
void Visit(LinkList L)
{
	LNode *p = L->next;
	while (p)
	{	cout<< p->data <<" ";
		p = p->next;
	}
	cout << endl;
}

Status InsertData(LinkList &L,ELEMTYPE e,int n) //插入元素到指定位置
{
	int i = 0;
	LNode *p = L;
	while (p)
	{
		if (i == n - 1)  //找到前驅位置
		{	
			LNode *q = new LNode;
			q->data = e;
			q->next = p->next;
			p->next = q;
			return OK;
		}
		p = p->next; i++; 
	}
	cout<<"插入位置不合法\n"; //若沒有找到前驅 這說明插入位置不合法
	return ERROR;
}

Status deleteData(LinkList &L,ELEMTYPE e) //刪除元素e
{
	LNode *p = L,*q;
	while (p->next)
	{
		if (p->next->data == e) //找到其前驅
		{
			q = p->next;
			p->next = q->next;
			delete (q);  //釋放空間
			return OK;
		}
		p = p->next;
	}
	
	//若沒有找到前驅,則沒有該元素
	cout<<"沒有該元素"<<endl;  
	return ERROR;
}

Status deletePo(LinkList &L,int n)  //刪除指定位置的元素
{
	if (isEmpty(L))  //判空
	{
		cout<<"空表\n";
		return ERROR;
	}
	int i = 0;
	LNode *p = L,*q;
	while (p->next)
	{
		if (i == n - 1)
		{
			q = p->next;
			p->next = q->next;
			delete (q);
			return OK;
		}
		p = p->next;i++;
	}
	//若沒有找到前驅,刪除位置不合法
	cout<<"刪除位置不合法"<<endl;
	return ERROR;
}

void Reverse(LinkList &L)  //單鏈表倒置 進行一次頭插法即可
{
	LNode *p = L->next,*q;
	L->next = NULL;
	while (p)
	{
		q = p->next;
		p->next = L->next;
		L->next = p;
		p = q;
	}

}
#endif
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章