单链表的实现
#define _CRT_SECURE_NO_WARNINGS
#include "iostream"
#include "stdlib.h"
#include "windows.h"
using namespace std;
#define OK 1
#define ERROR 0
#define M 100
typedef int ElemType;
typedef struct LNOde{
ElemType data; //结点的数据域
struct LNOde *next;
}LNode, *LinkList;
int InitList(LinkList &L);//初始化一个空的链表 //ok
void CreateList(LinkList &L, int n);//建立n个元素的链表 //ok
void TraverseList(LinkList L);//遍历链表 //ok
void SaveList(LinkList L);//保存链表的中数据到文件中 ;
void LoadList(LinkList &L);//从文件中加载数据到链表
int ListEmpty(LinkList L);//判链表是否为空 //ok
int ListLength(LinkList L);//求链表长度 //ok
int GetElem(LinkList L, int i, ElemType &e);//求链表中第i个元素的值 //ok
LNode *LocateElem(LinkList L, ElemType e);//求值为e的元素在链表中的位置 //ok
int ListInsert(LinkList &L, int i, ElemType e);//在第i个元素前插入值为e的元素 //ok
void ListDelete(LinkList &L, int i, ElemType &e);//删除表中所有值为item的数据元素,要求时间复杂度为O(n);
void DestroyList(LinkList &L);//销毁链表 //ok
void ClearList(LinkList &L);//清空链表 //ok
void f(){
system("cls");
LinkList L;
if (InitList(L))
cout << "单链表初始化成功!" << endl;
Sleep(1000);
system("cls");
cout << "请输入三个元素:" << endl;
CreateList(L, 3);
TraverseList(L);
int k;
cout << "第二个元素的值为:" << endl;
GetElem(L, 2, k);
cout << k << endl;
cout << "在第二个元素前插入100后";
ListInsert(L, 2, 100);
TraverseList(L);
}
int main(){
f();
return 0;
}
int InitList(LinkList &L){
L = new LNode;
L->next = NULL;
return OK;
}
void CreateList(LinkList &L, int n)
{//正位序输入N个元素的值,建立带表头结点的单链表L
L = new LNode;
L->next = NULL; //先建立一个带头结点的空链表
LinkList r = L; //尾指针r指向头结点
for (int i = 0; i < n; ++i){
LinkList p = new LNode; //生成新结点
cin >> p->data; //输入元素值赋给新结点*p的数据域
p->next = NULL; //将新结点*p插入尾结点*r之后
r->next = p; //r指向新的尾结点*p
r = p;
}
}
void TraverseList(LinkList L){
cout << "单链表中的元素为:" << endl;
LinkList p = L->next;
while (p){ //p不为空
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
void SaveList(LinkList L){ 有问题
FILE *fp;
if ((fp = fopen("D:\\单链表数据.dat", "wb")) == NULL)
perror("打开文件错误:");
fwrite((char*)L->next, sizeof(ElemType), 3, fp);
fclose(fp);
}
void LoadList(LinkList &L){ 有问题
FILE *fp;
if ((fp = fopen("D:\\单链表数据.dat", "rb")) == NULL)
perror("打开文件错误:");
fread((char*)L->next, sizeof(ElemType), 3, fp);
fclose(fp);
}
int ListEmpty(LinkList L){
if (!L->next)
return OK;
return ERROR;
}
int ListLength(LinkList L){
LinkList p;
p = L->next;
int s = 0;
while (p){
s++;
p = p->next;
}
return s;
}
int GetElem(LinkList L, int i, ElemType &e){
int j = 0;
LinkList p = L;
if (ListEmpty(L) || i > ListLength(L)){
cout << "表空或i值不合理!" << endl;
return ERROR;
}
while (j < i){
j++;
p = p->next;
}
e = p->data;
return OK;
}
LNode *LocateList(LinkList L, ElemType e){
LinkList p = L->next;
while (p&&p->data != e)
p = p->next;
return p;
}
int ListInsert(LinkList &L, int i, ElemType e){
LinkList p = L;
int j = 0;
if (ListEmpty(L) || i > ListLength(L)){
cout << "表空或i值不合理!" << endl;
return ERROR;
}
while (j < i - 1){ //把p移到第i-1个结点上
j++;
p = p->next;
}
LinkList s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
void DestroyList(LinkList &L){
LinkList p;
while (L){
p = L;
L = L->next;
delete p;
}
}
void ClearList(LinkList &L){
LinkList p, q;
p = L->next;
while (p){
q = p->next;
delete p;
p = q;
}
L->next = NULL;
}