单链表:
线性表的链式存储又称单链表,它是通过一组任意的存储单元来存储线性表中的数据元素。为了建立数据元素之间的线性关系,除存放元素自身的信息外,还需要存放一个指向其后继的指针。
结构示意图:
data | next |
特点:
这种存储方式增加删除元素较为方便,但不支持随机存取。
其基本实现代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//头插法建立单链表
LinkList List_HeadInsert(LinkList &L){
//每次均在头节点之后插入元素
LNode *s;//用于新节点的指针
int x;
L =(LNode*)malloc(sizeof(LNode));//创建头节点
L->next=NULL;//初始化为空
scanf("%d",&x);
while(x != 9999){
s=(LNode*)malloc(sizeof(LNode));//创建新节点
s->data=x;//将值放进数据域
s->next=L->next; //
L->next=s;//将新节点插入表中,L为头指针
scanf("%d",&x);
}
return L;
}
//尾插法建立单链表
LinkList List_TailInsert(LinkList &L){
//从表头到表尾正向建立单链表,每次均在表尾插入元素
int x;
L=(LNode *)malloc(sizeof(LNode));
LNode *s;
LNode *r=L;//r为表尾指针
scanf("%d",&x);//输入结点的值
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);//只要输入不结束,就继续创建新节点
}
r->next=NULL;//尾指针置空
return L;
}
//按序号查找节点值
LNode *GetElem(LinkList L,int i){
//取出带头结点单链表第i个位置的结点指针
int j=1;
LNode *p=L->next;//将指针指向头节点
if(i<1) return NULL;
if(i==0) return L;
while(p&&j<i){
p=p->next;
j++;
}
return p;
}
//按值查找
void LocateElem(LinkList L,int e){
LNode *p=L->next;
int cnt=1;//用于记录位置
while(p!=NULL&&p->data!=e){//当不到最后一个节点并且值没有查到时,继续查找
p=p->next;
cnt++;
}
if(p==NULL){
printf("不存在该值\n");
}else{
printf("该值的节点位置为:%d\n",cnt);
}
}
//插入节点操作
void InsertLNode(LinkList &L,int e,int i){
LNode *s=(LNode*)malloc(sizeof(LNode));//创建新节点
s->data=e;
LNode *p=GetElem(L,i-1);
s->next=p->next;//先成链
p->next=s; // 再断链,防止后面数据丢失
}
//删除节点操作
void DeleteNode(LinkList &L,int i){
LNode *p=GetElem(L,i-1);
LNode *q=p->next;
p->next=q->next;
free(q);
}
//求表长操作
int GetLength(LinkList L){
int length=0;
LNode *p=L;
while(p->next!=NULL){
p=p->next;
length++;
}
return length;
}
//输出表
int PrintList(LinkList L){
LNode *p=L;
//printf("%d->",p->data);
while(p->next!=NULL){
p=p->next;
printf("%d->",p->data);
}
printf("\n");
return 0;
}
int main(){
LinkList l1;
printf("头插法建立单链表,请输入数据,输入9999结束输入\n");
List_HeadInsert(l1);//头插法
PrintList(l1);//输出表
printf("当前表长为:%d\n",GetLength(l1));//求表长
InsertLNode(l1,9999,3); //插入节点操作
PrintList(l1);//输出表
printf("当前表长为:%d\n",GetLength(l1));//求表长
DeleteNode(l1,3); //删除节点
PrintList(l1);//输出表
printf("当前表长为:%d\n",GetLength(l1));//求表长
LNode *t=GetElem(l1,3);//按位置查找
printf("该位置结点值为%d\n",t->data);
LocateElem (l1,2);// 按值查找
LocateElem (l1,10);
// LinkList l2;
// printf("尾插法建立单链表,请输入数据,输入9999结束输入\n");
// List_TailInsert(l2);
// PrintList(l2);
return 0;
}
运行截图: