// 带头节点的单链表.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode, * LinkList;
void init(LinkList& l)//初始化
{
l = new LNode;
l->next = NULL;
}
void createhead(LinkList& l,int n)//头插法
{
init(l);
int c;
for (int i=0;i<n;i++)
{
cin >> c;
LinkList p = new LNode;
p->data = c;
p->next = l->next;
l->next = p;
}
}
void createtail(LinkList& l, int n)//tail插法
{
l = new LNode;//生成头节点
l->next = NULL;
LinkList r = l;//尾指针r,见李冬梅36页教材
for (int i=0;i<n;i++)
{
int c; cin >> c;
LinkList p = new LNode;
p->data = c; p->next = NULL;//p节点成为最后的节点,所以为空,如果p->next指针不初始化则为野指针(野指针重点)
r->next = p; r = p;
}
}
void traverse(LinkList& l)//l为头指针
{
LinkList p = l->next;
while (p)
{
cout << p->data<<endl;
p = p->next;
}
}
int length(LinkList& l)
{
LinkList p = l->next; int count = 0;
while (p)
{
count++; p = p->next;
}
return count;
}
int empty(LinkList& l)
{
if (l->next == NULL)
return 0;
else return 1;
}
void destory(LinkList& l)//这是连头节点也要删除
{
LinkList p;
while (l)
{
p = l->next;
delete l;
l = p;
}
}
void clearlist(LinkList& l)//保存头节点,从首元节点开始删除
{
LinkList q = l->next;
l->next = NULL;
while (q)
{
LinkList p = q->next; delete q; q = p;
}
}
void getElem(LinkList& l,int i, ElemType& e)//找出链表中第i个值
{
LinkList p = l->next;
int count = 1;
while (p&&count<i)
{
count++;
p = p->next;
}
if (!p || count > i) return;//(!p)i>n||i<=0(今天这个地方学到了,开心!!!!)
e = p->data;
cout << e;
}
LinkList locate(LinkList& l,ElemType& e)
{
LinkList p = l->next;
while (p && p->data != e)
{
p = p->next;
}
return p;//查找成功返回值为e的节点地址p,查找失败p为null
}
int insert(LinkList& l, int i, ElemType e)
{
LinkList p = l; int count = 0;//
//LinkList p = l->next; int count = 1;//可以尝试下,发现这样写在第一个位置无法插入(是错的,所以注意细节)
while (p && count < i - 1)
{
p = p->next; count++;
}
if (!p || count > i - 1)return 0;//i>n+1或者i<1(今天这个地方学到了,开心!!!!)
LinkList s = new LNode;
s->data = e;
s->next = p->next; p->next = s;
}
void del(LinkList& l, int i)
{
LinkList p = l; int count = 0;//道理同插入
while (p && count < i - 1)//查找第i-1个节点,p指向该节点
{
count++; p = p->next;
}
if (!(p->next == NULL) || (count > i - 1))return;//i>n或i<1,删除位置不合理
LinkList q = p->next;
p->next = q->next;
delete q;
}
//下面2个的函数,重点体会跟踪指针和工作指针,这在单链表常用
int prior(LinkList& l, ElemType cur_e, ElemType &pre_e)//这个稍微复杂点
{
LinkList q, p = l->next;
while (p && p->next)//循环条件写的真好!!!!!!
{
q = p->next;//q记录p的后继节点
if (q->data == cur_e)
{
pre_e = p->data; return 1;
}
p = p->next;
}
return 0;
}
int next(LinkList& l, ElemType& cur_e, ElemType pre_e)
{
LinkList p = l->next;
while (p && p->next)
{
if (p->data == pre_e)
{
cur_e = p->next->data; return 1;
}
p = p->next;
}
return 0;
}
int main()
{
LinkList l;
createtail(l, 4);
ElemType e;
//insert(l,1,8);
//getElem(l, 2, e);
traverse(l);
std::cout << "Hello World!\n";
//cout << length(l);
ElemType pre_e;
prior(l, 3,pre_e);
cout<< pre_e;
}
void bubblesort(LinkList& l,int length)
{
LinkList p, pre;
pre = p = l->next;
int flag = 1;//flag=1
for (int i=0;i<length-1&&(flag==1);i++)//
{
flag = 0;//flag=0,如果本趟排序没有发生交换,不会进行下趟排序
pre = p = l->next;//从首元节点开始
while (p)
{
pre = p;
p = p->next;
if (pre->data > p->data)//交换数据域
{
int temp = p->data; p->data = pre->data;
pre->data = temp;
flag = 1;
}
if (p->next == NULL)break;//最后一个节点,观察prior和next两个函数
}
}
}