单链表学习整理
运行环境-Dev c++
#include<stdio.h>
#include<stdlib.h>
//构建单链表结构体
typedef struct Node{
int data;
struct Node *next;
}Node,*LinkList;
//创建并申请结点空间的两种方式
/*
1、Node *p = (Node*) malloc (sizeof(Node));
2、LinkList P = (LinkList) malloc (sizeof(Node));
*/
//初始化单链表-带头结点
LinkList InitLink();
//创建单链表-带元素值-头插法
void CreateLink1(LinkList &L);
//创建单链表-带元素值-尾插法
void CreateLink2(LinkList &L);
//插入单条记录
void InsertLink(LinkList &L,int a);
//将数据插入到链表的指定位置
void InsertLinkById(LinkList &L,int i,int a);
//删除指定位置的单条记录
void DeleteLink(LinkList &L,int i,int &e);
//输出整个数据
void ShowLink(LinkList L);
//随时记录数据个数-改变头结点的值
void CountByHead(LinkList &L);
int main(){
//-----头插法建立链表
LinkList L1 = InitLink();//初始化单链表
printf("输出初始化带头结点的单链表:");
ShowLink(L1);
printf("\n");
CreateLink1(L1);//头插法创建单链表
printf("输出头插法创建的单链表:");
ShowLink(L1);//输出链表数据
printf("\n");
//-----尾插法建立链表
LinkList L2 = InitLink();//初始化单链表
CreateLink2(L2);//尾插法创建单链表
printf("输出尾插法创建的单链表为:");
ShowLink(L2);//输出链表数据
printf("\n");
//---单链表的插入
int a;
printf("输入插入的数据值为:");
scanf("%d",&a);
InsertLink(L2,a);//将a值插入到链表的表尾
printf("输出插入后的单链表为:");
ShowLink(L2);//输出链表数据
printf("\n");
//---指定位置下插入一条记录
int e,i;
printf("输入插入的数据值:");
scanf("%d",&e);
printf("请输入插入位置:");
scanf("%d",&i);
InsertLinkById(L2,i,e);//在位置3处插入数据e
printf("输出插入后的单链表为:");
ShowLink(L2);//输出链表数据
printf("\n");
//删除指定位置的数据
int j,temp;//将待删除的元素值赋值予temp ;j是待删除的数据元素的位置
printf("输入要删除的位置:");
scanf("%d",&j);
DeleteLink(L2,j,temp);//调用方法体
printf("删除的元素值为:%d\n",temp);
ShowLink(L2);//输出链表数据
printf("\n");
//-----数据个数
printf("单链表的长度既是头结点的数值为:%d",L2->data);//链表长度不包括头结点。
return 0;
}
//初始化头结点
LinkList InitLink(){
Node *P;
P = (Node *) malloc (sizeof(Node));//申请内存空间
P->next = NULL;//指针域置空。
P->data = 0;//将头结点的值设为0,方便记录数据个数。
return P;
}
//创建单链表-头插法-与输入成逆序态
void CreateLink1(LinkList &L){
LinkList P = L;
for(int i = 0; i <= 5 ;i++){
Node *Q = (Node*) malloc (sizeof(Node));//创建结点Q
Q->data = i;
Q->next = P->next;
P->next = Q;
//头结点数据域+1
CountByHead(P);
}
}
//创建单链表-尾插法-与输入顺序相同
void CreateLink2(LinkList &L){
LinkList End = L;
for(int i = 0; i <= 5; i++){
Node *P = (Node*) malloc (sizeof(Node));
P->data = i;
P->next = NULL;
End->next = P;
End = P;
CountByHead(L);//头结点数据域+1
}
}
//插入单条记录-末尾
void InsertLink(LinkList &L,int a){
LinkList Q = L;
LinkList P = (LinkList) malloc (sizeof(Node));
P->data = a;
P->next = NULL;
while(Q->next){
Q = Q->next;
}
Q->next = P;
CountByHead(L);//头结点数据域+1
}
//在指定的位置插入数据e
void InsertLinkById(LinkList &L,int i,int e){
LinkList Q = L;
LinkList P = (LinkList) malloc (sizeof(Node));
P->data = e;
P->next = NULL;
if(i <1 || i-1 > L->data){
printf("插入位置不符合要求");
exit(0);//退出进程
}
int k = 1;
//寻找到第i-1个元素
while(Q->next && k<i){
Q = Q->next;
k++;
}
P->next = Q->next;
Q->next = P;
CountByHead(L);
free(P);//释放表空间
}
//删除指定位置的数据元素
void DeleteLink(LinkList &L,int j,int &temp){
LinkList P = L;
LinkList Q;
if(j<1||j>L->data){
printf("删除位置非法!!");
exit(0);
}
//寻找第j - 1个数据元素
int k = 1;
while(P->next && k < j){
P = P->next;
k++;
}
temp = P->next->data;//把删除的数据赋值给temp
Q = P->next;
P->next = Q->next;
L->data--;//数据元素个数--
free(Q);
}
//输出单链表
void ShowLink(LinkList L){
while(L){
printf("%d ",L->data);
L = L->next;
}
}
//利用头结点记录数据个数
void CountByHead(LinkList &L){
L->data ++;
}