// 不带头节点的单链表的基本操作.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
using namespace std;
#define destorylist clearlist
typedef int elemtype;
typedef struct LNode {
elemtype data;
struct LNode* next;
}LNode,*LinkList;
void init(LinkList& l)
{
l = NULL;
}
void destorylist(LinkList& l)
{
LinkList p = l;
while (p)
{
p = l;
l = l->next;
free(l);
}
}
int empty(LinkList &l)//空是1,不空为0
{
if (!l)
return 0;
else
return 1;
}
int listlength(LinkList& l)
{
LinkList p = l;
int j = 0;//小心
while (p)
{
j++; p = p->next;
}
return j;
}
void getelem(LinkList& l,elemtype& e,int i)
{
LinkList p = l;
int j = 1;//小心
while (p && j < i)
{
j++; p = p->next;
}
if (j == i && p)
e = p->data;
}
void createhead(LinkList& l,int a[4])
{
LinkList p = new LNode;
l = p;
p->data = a[0];
p->next = NULL;
for (int i = 1; i < 4; i++)
{
LinkList s = new LNode;
s->data = a[i];
s->next = l;
l = s;
}
}
//下面2个locate函数,观察计算器i,有什么不同
int LocateElem(LinkList l, elemtype e)
{
LinkList p = l; int i = 1;
while (p)
{
if (p->data == e)return i;
else p = p->next;
i++;//相对于while条件p的next
}
}
int LocateElem1(LinkList L, elemtype e)
{
int i = 0;
LinkList p = L;
while (p)
{
i++;
if (p->data==e)
return i;
p = p->next;
}
return 0;
}
void insert(LinkList& l, int i, elemtype e)
{
if (i == 1)
{
LinkList s = new LNode;
s->data = e;
s->next = l;
l = s;
}
else//先找到第i-1个数据
{
int j = 1; LinkList p = l;
while (p && j < i - 1)//第i-1个节点为p,计数器j对应第i个节点(即p->next),所以j初始化为1
{
j++;
p = p->next;
}
if (p)
{
LinkList s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
}
}
}
void dellist(LinkList& l,int i)
{
LinkList p = l;
if (i == 1)
{
l = p->next;
free(p);
}
else
{
int j = 1;
while (p->next && j < i - 1)//第i-1个节点为p,计数器j对应第i个节点(即p->next),所以j初始化为1
{
j++; p = p->next;
}
if (p->next != NULL || j > i - 1)return;
LinkList q = p->next;
p->next = q->next;
free(q);
}
}
void traverse(LinkList& l)
{
LinkList p = l;
while (p) {
cout << p->data << endl;
p = p->next;
}
}
int main()
{
int a[4] = {2,4,1,3};
LinkList l = NULL;
createhead(l, a);
traverse(l);
std::cout << "Hello World!\n";
elemtype e;
getelem(l, e, 3);
cout << e <<"\n";
cout << LocateElem1(l, 1)<<endl;
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
下面很多地方注意添加的注释:
// 不带头节点的单链表的基本操作.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
using namespace std;
#define destorylist clearlist
typedef int elemtype;
typedef struct LNode {
elemtype data;
struct LNode* next;
}LNode,*LinkList;
void init(LinkList& l)
{
l = NULL;
}
void destorylist(LinkList& l)
{
LinkList p = l;
while (p)
{
p = l;
l = l->next;
free(l);
}
}
int empty(LinkList &l)//空是1,不空为0
{
if (!l)
return 0;
else
return 1;
}
int listlength(LinkList& l)
{
LinkList p = l;
int j = 0;//小心
while (p)
{
j++; p = p->next;
}
return j;
}
void getelem(LinkList& l,elemtype& e,int i)
{
LinkList p = l;
int j = 1;//小心
while (p && j < i)
{
j++; p = p->next;
}
if (j == i && p)
e = p->data;
}
void createhead(LinkList& l,int a[4])
{
LinkList p = new LNode;
l = p;
p->data = a[0];
p->next = NULL;
for (int i = 1; i < 4; i++)
{
LinkList s = new LNode;
s->data = a[i];
s->next = l;
l = s;
}
}
//下面2个locate函数,观察计算器i,有什么不同
int LocateElem(LinkList l, elemtype e)
{
LinkList p = l; int i = 1;
while (p)
{
if (p->data == e)return i;
else p = p->next;
i++;//相对于while条件p的next
}
}
int LocateElem1(LinkList L, elemtype e)
{
int i = 0;
LinkList p = L;
while (p)
{
i++;
if (p->data==e)
return i;
p = p->next;
}
return 0;
}
void insert(LinkList& l, int i, elemtype e)
{
if (i == 1)
{
LinkList s = new LNode;
s->data = e;
s->next = l;
l = s;
}
else//先找到第i-1个数据
{
int j = 1; LinkList p = l;
while (p && j < i - 1)//第i-1个节点为p,计数器j对应第i个节点(即p->next),所以j初始化为1
{
j++;
p = p->next;
}
if (p)
{
LinkList s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
}
}
}
void dellist(LinkList& l,int i)
{
LinkList p = l;
if (i == 1)
{
l = p->next;
free(p);
}
else
{
int j = 1;
while (p->next && j < i - 1)//第i-1个节点为p,计数器j对应第i个节点(即p->next),所以j初始化为1
{
j++; p = p->next;
}
if (p->next != NULL || j > i - 1)return;
LinkList q = p->next;
p->next = q->next;
free(q);
}
}
void traverse(LinkList& l)
{
LinkList p = l;
while (p) {
cout << p->data << endl;
p = p->next;
}
}
void zhijieinsertsort(LinkList& l)//直接插入排序,在我的博客其他博客对这个问题有详细解释
{
if (l == NULL && l->next == NULL)
return;
LinkList sorthead = l;
LinkList cur = l->next;
while (cur)//cur指向无序区
{
LinkList q = cur->next;
if (cur->data < sorthead->data)
{
cur->next = sorthead;
sorthead = cur;
break;
}
else
{
LinkList sortprev = sorthead;
LinkList sortcur = sorthead->next;
while (sortcur)
{
if (cur->data <= sortcur->data)
{
sortprev->next = cur;
cur->next = sortcur;
break;
}
else
{
sortprev = sortcur;
sortcur = sortcur->next;
}
}
if (sortcur == NULL)
{
sortprev->next=cur;
cur->next = NULL;
}
}
cur = q;
}
}
int main()
{
int a[4] = {2,4,1,3};
LinkList l = NULL;
createhead(l, a);
traverse(l);
std::cout << "Hello World!\n";
elemtype e;
getelem(l, e, 3);
cout << e <<"\n";
cout << LocateElem1(l, 1)<<endl;
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
观察计数器?????
398

被折叠的 条评论
为什么被折叠?



