链表:线性表的链式存储实现。
//线性表的链式存储实现--链表
//链表包括:单链表、双链表、循环链表、静态链表。
//以下实现的是带头结点的单链表
//Elemtype:int
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;//数据域
struct LNode* next;//指针域
}LNode,*LinkList;
bool InitList(LinkList &L){//初始化一个单链表
L=(LNode*)malloc(sizeof(LNode));//分配一个头结点
if(L==NULL)return false;//内存不足,分配失败
L->next=NULL;
return true;
}
LinkList List_TailInsert(LinkList &L){//尾插法建立单链表
int x;//要尾插的元素
L=(LinkList)malloc(sizeof(LNode));//分配一个头结点
LNode *s,*r=L;//r为表尾指针
scanf("%d",&x);
while(x!=9999){//输入9999表示结束
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;//更新最后一个节点
scanf("%d",&x);
}
r->next=NULL;
return L;
}
LinkList List_HeadInsert(LinkList &L){//头插法建立单链表
LNode* s;//头插法不需要尾指针
int x;
L=(LNode*)malloc(sizeof(LNode));//初始化头结点
L->next=NULL;//头插需要先给next赋NULL,因为这会一直是表尾
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
//not important functions
bool Empty(LinkList L){
if(L->next==NULL)return true;
else return false;
}
bool PrintList(LinkList L){
if(L->next==NULL)return false;//空表
LNode* p=L->next;//指示指针p指向第一个结点
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
return true;
}
int Length(LinkList L){//求表长
int len=0;
LNode* p=L;
while(p->next!=NULL){
p=p->next;
len++;
}
return len;
}
//important functions
bool ListInsert(LinkList &L,int i,int e){//在位序i的位置插入元素e
if(i<1)return false;//合法性检查
LNode* p=L;//指针p指向当前扫描的节点
int j=0;//位序
while(p!=NULL&&j<i-1){//循环找到第i-1个节点,在其后面插入节点
p=p->next;
j++;
}
if(p==NULL)return false;//第i-1个节点不存在,即插入的位置大于链表长度+1
//后插
LNode* s=(LNode*)malloc(sizeof(LNode));//插入的节点
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
bool InsertPriorNode(LNode* p,int e){//没有传入头指针前提下,在p节点之前插入元素e
if(p==NULL)return false;//检查合法性
LNode* s=(LNode*)malloc(sizeof(LNode));
if(s==NULL)return false;//内存分配失败
//p后插入节点s
s->next=p->next;
p->next=s;
//p,s交换数据域
s->data=p->data;
p->data=e;
return true;
}
bool ListDelete(LinkList &L,int i,int &e){//按位序删除
if(i<1)return false;
LNode* p=L;//指示指针指向头结点
int j=0;//位序
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL)return false;//检查位序i-1节点的合法性
if(p->next==NULL)return false;//位序i节点不存在
LNode* q=p->next;//q指向第i个节点
e=q->data;//赋给e
p->next=q->next;
free(q);//释放第i个节点
return true;
}
bool DeleteNode(LNode* p){//删除指定节点
if(p==NULL)return false;
LNode* q=p->next;//q指向p的后继节点
p->data=q->data;//q数据域赋给p
p->next=q->next;
free(q);
return true;
}
LNode* GetElem(LinkList L,int i){//按位查找,返回第i个元素(包括头结点)
if(i<0)return NULL;
LNode* p=L;//指示指针指向头结点
int j=0;//位序
while(p!=NULL&&j<i){
p=p->next;
j++;
}
return p;
}
LNode* LocateElem(LinkList L,int e){//按值查找
LNode* p=L->next;//p初始指向第一个节点(位序1)
while(p!=NULL&&p->data!=e){
p=p->next;
}
return p;
}
int main(){
LinkList L;
List_TailInsert(L);
PrintList(L);
printf("\n");
LNode* p=L->next;
InsertPriorNode(p,10);
int e;
ListDelete(L,3,e);
PrintList(L);
return 0;
}