链表:
定义:
用一组任意的存储单元储存线性表的数据元素。
特点:
链表只能顺序存取,不能直接存取。
链表:单链表,双向链表,循环链表。
单链表的操作:
定义:
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;//注意在定义指针域时所采用的类型。
//*LinkList说明,LinkList型的变量均为指针。
初始化:
void chushihua(LinkList &L){
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
}
建立:
//链表的建立以输入的元素为负数就不再输入为例
LinkList creat(){
LinkList L,p,s;
L=(LinkList)malloc(sizeof(LNode));
p=L;
int e;
scanf("%d",&e);
while(e>=0){
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
p->next=s;
p=s;
scanf("%d",&e);
}
p->next=NULL;
return L;
}//尾插法建立单链表。
LinkList creat(){
LinkList p,s,L;
L=(LinkList)malloc(sizeof(LNode));//链表的这个结点分配一定不要忘了
int e;
L->next=NULL;
scanf("%d",&e);
while(e>=0){
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=L->next;
L-next=s;
scanf("%d",&e);
}
return L;
} //头插法建立单链表
求表长:
int length(LinkList L){
int j=0;
LinkList p=L->next;
while§{
j++;
p=p->next;
}
return j;
}
遍历:
void print(LinkList L){
LinkList p;
p=L->next;
while§{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
查找:
int LocateElem(LinkList L,int e){
//在链表中寻找元素e,存在返回序号,不存在,返回0。
LinkList p;
int i=1;
p=L->next;
while§{
if(p->data==e) return i;
p=p->next;
i++;
}
return 0;
}
插入:
int ListInsert(LinkLIst L,int i,int e){
//在链表L中i位置前插入元素e。
LinkList p=L,s;
int j=0;
while(p&&j<i-1){
//对于这里的j初始化为0要是不好理解,可以举个例子:
//如果i=2,那么while循环应该做一次,让p指向首元结点,如果j初始化为1,循环一次都不做
p=p->next;
j++;
}
if(!p||i<1) return 0;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p-next=s;
return 1;
}
删除:
int ListDelete(LinkList L,int i){
LinkList p=L;//注意单链表的插入和删除都是从头结点开始的。
LinkList q;
int j=0;
while(p->next&&j<i-1){
//当i=2时(假设2合法)该循环会让p停在首元结点的位置。
//该循环会让p停在i-1的位置上。
p=p->next;
j++;
}
if(i<1||!p->next) return 0;
q=p->next;
p->next=q->next;
free(q);
return 1;
}
在链表这里要注意的是,只有在增加结点时才是用malloc函数。
while§会使链表的循环停在最后一个结点的下一个结点。
while(p->next)会使链表停在最后一个结点