1.参考学习博文(写的相当好的文章):
http://t.csdnimg.cn/AipNl
2.关于我的总结:
定义单链表:
typedef struct LNode
{
Elemtype data;
struct LNode* next;
}LNode;
data用来存放元素值,next用来指向后继结点,
typedef是自定义结构体,单链表的结点类型为LNode
typedef struct LNode{//单链表的结构定义
int data;//定义int类型的数据域
struct LNode *next; //定义指针域
}LNode,*linklist;
这个地方会出现两个让人比较迷的东西:结构指针LNode和linklist。本质上而言,这两种类型是等价的。通常用linklist说明指针变量,强调它是某个单链表的头指针变量,定义为linklist L,L表示头指针。LNode用来定义单链表中结点的指针,例如LNode *p,p为结点的指针变量,p也可以定义为头结点。但是在方法的编写时,这两种定义会混合使用,非常容易迷惑我们的思维。我都只使用LNode来定义。
出处:http://t.csdnimg.cn/AipNl
3.关于我的疑问:
按序号查找元素时,元素的值,用e返回,为什么e要用引用型变量&e
int Getelem_L(LNode* L, int i, int &e)
4.实战代码:
#define _CRT_SECURE_NO_WARNINGS
typedef int Elemtype;
#define ERROR -1
#include<stdio.h>
#include <iostream>
using namespace std;
//定义结构体储存俩个元素:data存放元素值,next指向后继节点。
typedef struct LNode
{
Elemtype data;
struct LNode* next;
}LNode;
//初始化单链表
void InitList(LNode* & L)
{
L = new LNode;
L->next = NULL;
}
//建立单链表
//头插法
//void CreateList_H(LNode*& L, int n)
//{
// LNode* p;
// for (int i = n; i > 0; --i)
// {
// p = new LNode;
// cin >> p->data;
// p->next = L->next;
// L->next = p;
// }
//}
//尾插法
void CreateList_R(LNode*& L, int n)
{
LNode* r = L,*p;
for (int i = 0; i < n; ++i)
{
p = new LNode;
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
}
//输出单链表
void DispList(LNode* L)
{
LNode* p = L->next;
printf("打印单链表:\n");
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
//求单链表的长度
int ListLength_L(LNode* L)
{
int i = 0;
LNode* p;
p = L->next;
while (p) {
i++;
p = p->next;
}
return i;
}
//按序号查找单链表中的元素(从p=L->next依次扫描,j=1,p每次移动j加1,当j==i时,则找到)
int Getelem_L(LNode* L, int i, int &e)
{
LNode *p = L->next;
int j = 1;
while (p && j < i)
{
p = p->next;
++j;
}
if (!p || j > i)
return ERROR;
e = p->data;
return e;
}
//按值查找(从第一个结点依次和e比较,找到返回位置或地址,未找到则返回0或NULL)
int LocateLem_L(LNode* L, int e)
{
int i = 1;
LNode* p = L->next;
while (p && p->data != e)
{
p = p->next;
i++;
}
if (p == NULL)
return(0);
else
return i;
}
//单链表的插入操作(在L中第i个元素之前插入e)
void ListInsert_L(LNode*& L, int i, int e)
{
LNode* p = L;
LNode* s;
int j = 0;
while (p && j < i - 1) //查找到第i-1个元素
{
p = p->next;
++j;
}
s = new LNode; //创建新结点s,将data域置为e
s->data = e;
s->next = p->next;//将新结点插入结点p之后
p->next = s;
}
//单链表的删除操作(找到p指向的a(i-1),保存ai,令p->next指向a(i+1),p->next=p->next->next,最后释放结点ai的空间)
void ListDelete_L(LNode*& L, int i, int& e)
{
LNode* p = L;
LNode* q; //创建一个新结点q用来临时保存被删除的元素
int j = 0;
while (p->next && j < i - 1) //查到第i-1个元素,p指向第i-1个元素
{
p = p->next;
++j;
}
if (!(p->next) || j > i - 1) //如果查不到第i-1个元素或者查的元素超过范围,则不进行接下来的操作
return;
q = p->next; //q指向第i个元素
p->next = q->next; //p指向第i+1个元素
e = q->data; //e保存结点q的元素
delete q; //释放q的空间
printf("删除的元素是:%d", e);
}
int main()
{
LNode* L;
//初始化单链表
InitList(L);
//尾插法
printf("please input five numbers\n");
CreateList_R(L, 5);
printf("-----------------------------------\n");
//输出单链表
DispList(L);
printf("-----------------------------------\n");
//求表长
printf("单链表的长度为:%d\n", ListLength_L(L));
printf("-----------------------------------\n");
//按序号查找单链表中的元素
printf("你要查找的元素序列是:");
int i,e;
cin >> i;
printf("\n");
printf("要查找的元素是:%d\n",Getelem_L(L, i, e));
printf("-----------------------------------\n");
//按值查找
printf("请输入要查找的值:");
cin >> e;
printf("\n");
printf("该元素的位置是:%d\n", LocateLem_L(L, e));
printf("-----------------------------------\n");
//插入结点
int a=0 , b=0;
printf("请输入要插入的位置:");
cin >> a;
printf("请输入要插入元素的值:");
cin >> b;
ListInsert_L(L, a, b);
printf("\n");
DispList(L);//输出单链表
printf("-----------------------------------\n");
//删除元素
printf("请输入要删除的元素位置:\n");
int c = 0,d=0;
cin >> c;
ListDelete_L(L, c,d);
printf("\n");
DispList(L);//输出单链表
printf("-----------------------------------\n");
return 0;
}