线性表的链式存储
单链表
//链表的结点类型
typedef struct lnode
{
datatype data;
struct lnode *next;
}LNode,*LinkList;
//定义头指针变量
LinkList L;
*在表头插入,建立线性表的链式存储*
//建立一个不带头结点的单链表
LinkList Creat_LinkList1()
{
LinkList L = NULL;
LNode *s;
int x;
scanf("%d",&x);
while(x != flag)//flag 为根据实际情况设定的结束数据输入的标志数据
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = L;
L = s;
scanf("%d",&x);
}
//将当前链表作为返回值
return L;
}
//建立一个带头结点的单链表
LinkList Creat_LinkList1()
{
LinkList L = new LNode;
if(L == NULL)
return NULL;
L->next = NULL;
LNode *s;
int x;
scanf("%d",&x);
while(x != flag)//flag 为根据实际情况设定的结束数据输入的标志数据
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d",&x);
}
//将当前链表作为返回值
return L;
}
*在表尾插入,建立线性表的链式存储*
//没有头结点的单链表
LinkList Creat_LinkList2()
{
LinkList L = NULL;
LNode *s,*r = NULL;
int x;
scanf("%d",&x);
while(x != flag)
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
if(L == NULL)L = s;//第一个结点的处理
else r->next = s;
r = s;
scanf("%d",&x);
}
if(r != NULL) r->next = NULL;//对于非空表,最后结点的指针域置空
return L;
}
//有头结点的单链表
LinkList Creat_LinkList2()
{
LinkList L = NULL;
LNode *s,*r = NULL;
int x;
scanf("%d",&x);
while(x != flag)
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
if(L == NULL)
{
L->next = s;
}
r->next = s;
r = s;
scanf("%d",&x);
}
if(r != NULL) r->next = NULL;//对于非空表,最后结点的指针域置空
return L;
}
//求表长,L是带头结点的单链表
int Length_LinkList1(LinkList L)
{
LNode *p = L;//p指向头结点
int j = 0;
while(p->next)
{
p = p->next;
j++;
}
return j;
}
//求表长,L是不带头结点的单链表
int Length_LinkList1(LinkList L)
{
LNode *p = L;//p指向头结点
int j = 0;
while(p)
{
p = p->next;
j++;
}
return j;
}
//单链表中的查找,L为带头结点的单链表
LNode *Get_LinkList(LinkList L,int i)
{
LNode *p = L;
int j;
while(p->next != NULL && j < i)
{
p = p->next;
j++;
}
if(j == i) return p;
else return NULL;
}
//L为不带头结点的单链表
LNode *Get_LinkList(LinkList L,int i)
{
LNode *p = L;
int j;
while(p != NULL && j < i)
{
p = p->next;
j++;
}
if(j == i) return p;
else return NULL;
}
//按值查找
LNode *Locate_LinkList(LinkList L,datatype x)
{
//在单链表L中查找值为x的结点,找到后返回其指针,否则返回空
LNode *p = L->next;
while(p != NULL && p->data != x)
{
p = p->next;
}
return p;
}
//单链表的插入
1. 先找到i-1个结点
2. 填装新结点
3. 将新结点插入(先接链表的后面,再接链表的前面)
int Insert_LinkList(LinkList L,int i,datatype x)
{
LNode *p;
p = Get_LinkList(L,i-1);
if(p == NULL)
{
//第i-1个不存在不能插入
printf("参数i错误");
return 0;
}else
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = p->next;
p->next = s;
return 1;
}
}
//单链表的删除
1. 先找到i-1个结点
2. 看i-1的下一个结点是否存在,如果存在,则删除
int Del_LinkList(LinkList L,int i)
{
LinkList p,s;
p = Get_LinkList(L,i-1);
if(p == NULL)
{
printf("第i-1个节点不存在");
return -1;
}else if(p->next == NULL)
{
printf("第i个结点不存在");
return 0;
}else
{
s = p->next;
p->next = s->next;
free(s);
return 1;
}
}
循环链表
对于单链表而言,最后一个结点的指针域是空指针,如果将该链表头指针置于该指针域,则使链表头尾结点相连,就构成了单循环链表
链表应用举例
单链表逆置
void reverse(LinkList H)
{
LNode *p;
p = H->next;
H->next = NULL;//将原链表置为空表H
while(p)
{
q = p;
p = p->next;
q->next = H->next;
H->next = q;
}
}