1、基本概念
链表:一种线性表,但是其物理存储结构使用一组地址任意的存储单元存储数据。
优点:易于插入和删除(相对于数组或者队列等)
2、单链表的单元结构体
分为两个部分:
数据域
指针域(形成链式结构)
┌──┬──┐
│data│next│
└──┴──┘
│data│next│
└──┴──┘
typedef struct node{
int data;
struct node* next;
}LNode, *pNode;
3、单链表的表示和相关操作
3.1、单链表的图示
3.2、单链表的创建
输入:单链表的长度
输出:单链表的头结点
代码如下:
pNode CreateList(int n)
{
pNode p,r,head = NULL;
int i, value;
for(i=0; i<n; i++){
scanf("%d", &value);
p = (pNode)malloc(sizeof(LNode));
p->data = value;
p->next = NULL;
if(!head)
head = p;
else
r->next = p;
r = p; //当前操作节点
}
return head;
}
3.3、单链表的排序
输入:头结点
输出:头结点
思想:采用冒泡排序法,不改变地址,只改变相应地址中的内容
代码如下:
pNode SortList(pNode head)
{
int i,j,len,temp;
pNode p;
len = LengthList(head); //计算链表的长度
p= head;
for(i=1; i<len; ++i){
p = head;
for(j=0; j<len-i; ++j){
if(p->data>p->next->data){
temp = p->next->data;
p->next->data = p->data;
p->data = temp;
} //两节点数据的交换
p = p->next;
}
}
return head;
}
3.4、单链表的插入
输入:
参数1 头结点
参数2 插入的数值
输出:
头结点
代码如下:
pNode InsNode(pNode head, int value)
{
pNode p, last, r;
p = head;
while(p->data<value && p->next!=NULL){
last = p;
p = p->next;
}
if(p->data >= value){
if(p == head){
head = (pNode)malloc(sizeof(LNode));
head->data = value;
head->next = p;
}
else{
r = (pNode)malloc(sizeof(LNode));
last->next = r;
r->next = p;
r->data = value;
}
}
else{
r = (pNode)malloc(sizeof(LNode));
r->next = NULL;
r->data = value;
p->next = r;
}
return head;
}
3.5、单链表的删除
思想:
循环结束条件:找到需删除的节点或者到达链表结尾,没有节点可以删除
在结束后,找到节点
分情况讨论
pNode DelNode(pNode head, int value)
{
pNode p, last = NULL;
p = head;
while(p->data!=value && p->next!=NULL){
last = p;
p = p->next;
}
if(p->data == value){
if(p == head){
head = p->next;
free(p);
}
else
last->next = p->next;
}
else
printf("\n%d could not been found", value);
return head;
}
3.6、逆序
思想:将每两个节点间的指针指向反向
pNode ReverseList(pNode head)
{
pNode p1,p2,p3;
p1 = head;
p2 = p1->next;
while(p2){
p3 = p2->next; //保留下一个
p2->next = p1;
p1 = p2;
p2 = p3;
}
head->next = NULL;
head = p1;
return head;
}
3.7、打印链表
void PrintList(pNode head)
{
pNode p;
if(head){
p = head;
while(p){
printf("%5d", p->data);
p = p->next;
}
printf("\n");
}
}
3.8、计算链表的长度
int LengthList(pNode head)
{
int count = 0;
pNode p;
p = head;
while(p){
count++;
p = p->next;
}
return count;
}