---------单链表---------
逻辑上相邻的数据元素物理存储上不一定相邻,即数据元素离散的分布在存储空间中。元素之间的顺序关系通过指针链接。增删操作只用修改指针即可,不用每次都移动大量的数据元素。 使用链式存储,内存空间利用率大,存储密度低,但每次查找元素都需要从表头开始遍历,失去了随机存取的优点。
★注:为了操作上的方便,通常在链表第一个结点前附加一个头结点,结点内通常不存储任何信息。
-----------定义---------
typedef struct LNode{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode ,*LinkList ;
-------基本操作-------
InitLinkList(&L);//单链表的初始化:带头结点:L->next=NULL; 不带头节点:L=NULL;
Head_CreateLinkList(&L); //头插法创建单链表(常用于元素逆置)
Tail_CreateLinkList(&L);//尾插法
InsertLinkList(&l,i,e);//插入:在位序i出的数据元素后插入数据值为e的数据元素
DeleteLinkList(&L,i);//删除:删除位序i处的结点
GetElement(L,e);//按值查找
LocateElement(L,i)//按位查找
Length(L);//统计长度
Print(L);//输出
---------实现--------
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode {
int data;
struct LNode *next;
} LNode,*LinkList;
bool InitLinkList(LinkList &L) {
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
return true;
}
bool Head_CreateLinkList(LinkList &L) {
LNode* P;
int i;
int e;
printf("请输入要插入的数据元素个数:");
scanf("%d",&i);
printf("请输入要插入的数据:");
for(int j=0; j<i; j++) {
scanf("%d",&e);
P=(LNode *)malloc(sizeof(LNode));
P->data=e;
P->next=L->next;
L->next=P;
}
return true;
}
bool Tail_CreateLinkList(LinkList &L) {
LNode* P,*r=L;
int i;
int e;
printf("请输入要插入的数据元素个数:");
scanf("%d",&i);
printf("请输入要插入的数据:");
for(int j=0; j<i; j++) {
scanf("%d",&e);
P=(LNode *)malloc(sizeof(LNode));
P->data=e;
P->next=r->next;
r->next=P;
r=P;
}
r->next=NULL;
return true;
}
bool InsertLinkList(LinkList &L) {
int i,j=0;
int e;
printf("你要在第几个位置的元素后插入新的数据元素呢:");
scanf("%d",&i);
printf("那你要插入的数据值是多少呢:");
scanf("%d",&e);
//查找第i个元素
LNode *P,*S;
P=L->next;
while(P!=NULL&&(++j)!=i) {
P=P->next;
}
//插入
S=(LNode *)malloc(sizeof(LNode));
S->data=e;
S->next=P->next;
P->next=S;
return true;
}
bool DeleteLinkList(LinkList &L) {
int i,j=0;
printf("你要删除第几个位置的数据元素呢:");
scanf("%d",&i);
LNode *P,*S;
P=L;
//先找到待删除位置的前一个元素
while(P->next!=NULL&&(++j)!=i) {
P=P->next;
}
//删除操作
S=P->next;
P->next=S->next;
free(S);
return true;
}
LNode* GetElement(LinkList L) {
int k=0;//记录位置
int e;
printf("请输入要查找的数据值:");
scanf("%d",&e);
LNode *P;
P=L;
while(P->next!=NULL&&P->data!=e) {
k++;
P=P->next;
}
printf("要查找的数据元素在第( %d )个位置上\n",k);
return P ;
}
LNode* LocateElement(LinkList L) {
int i,j=0;
printf("你要查第几个元素值呢:");
scanf("%d",&i);
LNode *P;
P=L->next;
while(P!=NULL&&(++j)!=i) {
P=P->next;
}
printf("第( %d )个位置上的数据元素值为( %d )",i,P->data);
return P;
}
LinkList Print(LinkList L) {
LNode *P;
P=L->next;
printf("创建的单链表是: (");
while(P!=NULL) {
printf("%4d",P->data);
P=P->next;
}
printf(" )\n");
return L;
}
int Length(LinkList L) {
int k=0;
LNode *P;
P=L;
while(P->next!=NULL) {
P=P->next;
k++;
}
printf("单链表长度是:%4d",k);
printf("\n");
return k;
}
int main() {
LinkList L;//单链表的声明
InitLinkList(L);
// Head_CreateLinkList(L);
Tail_CreateLinkList(L);
InsertLinkList(L);
DeleteLinkList(L);
Print(L);
Length(L);
GetElement(L);
LocateElement(L);
return 0;
}