目录
链表介绍
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) +指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
一、实现单链表的具体操作
- 定义链表元素
- 创建单链表:①头插法 ②尾插法
- 按位序插入结点
- 按位序删除结点
- 按位查找结点
- 销毁顺序表
- 打印链表
二、各功能实现函数详解
1.定义链表数据元素
代码如下(示例):
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
//定义结点
typedef struct LNode{
int data; //数据域
struct LNode * next;//指针域
}* LinkList,LNode;
2.创建单链表
①头插法
代码如下(示例):
void CreatList(LinkList * L){
LinkList p,s;
p=*L=(LinkList)malloc(sizeof(LNode)); //创建头结点
p->next=NULL; //将头节点的指针指向NULL,防止存在遗留的脏数据
int x;
printf("请输入元素,选择0即停止输入\n");
scanf("%d",&x);
while(x){
s=(LinkList)malloc(sizeof(LNode));//创建新的结点
s->data=x; //将数据赋值给新结点的数据域
s->next=p->next;
p->next=s;
scanf("%d",&x);
}
}
②尾插法
代码如下(示例):
void CreatList1(LinkList * L){
LinkList p,s;
*L=(LinkList)malloc(sizeof(LNode)); //创建头结点
p=*L; //创建一直指向表尾的指针
p->next=NULL; //将头节点的指针指向NULL,防止存在遗留的脏数据
int x;
printf("请输入元素,选择0即停止输入\n");
scanf("%d",&x);
while(x){
s=(LinkList)malloc(sizeof(LNode));//创建新的结点
s->data=x; //将数据赋值给新结点的数据域
p->next=s;
p=s;
scanf("%d",&x);
}
p->next=NULL;
}
3.插入结点
void InsertList(LinkList * L,int i ,int e){
if(i<1)
return;
LNode * p=*L; //p为指向当前结点的指针
int j =0; //p指针指向的当前结点,当前位置为头结点
while(p!=NULL && j<i-1){
p=p->next;
j++;
}
LNode * s=(LNode *)malloc(sizeof(LNode)); //创建新结点
s->data = e;
s->next = p->next;
p->next =s;
}
4.删除结点
void DeleteList(LinkList * L,int i){
if(i<1)
return;
LNode * p=*L; //p为指向当前结点的指针
int j =0; //p指针指向的当前结点,当前位置为头结点
while(p!=NULL && j<i-1){
p=p->next;
j++;
}
if(p->next==NULL)
return;
LNode * s=(LNode *)malloc(sizeof(LNode));
s=p->next;
p->next=s->next;
free(s);
}
5.查找结点
void SearchList(LinkList * L,int i){
if(i<1)
return;
LNode * p=*L; //p为指向当前结点的指针
int j =0; //p指针指向的当前结点,当前位置为头结点
while(p!=NULL && j<i-1){
p=p->next;
j++;
}
printf("该值为%d",p->next->data);
}
6. 销毁链表
void DestoryList(LinkList * L){
LinkList p,temp;
p=(*L)->next;//从第一个结点开始
while(p!=NULL){
temp=p->next;
free(p);
p=temp;
}
(*L)->next=NULL; //让头结点指针指向NULL
}
7.打印链表
void PrintList(LinkList L){
LinkList p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
总代码
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
//定义结点
typedef struct LNode{
int data; //数据域
struct LNode * next;//指针域
}* LinkList,LNode;
//函数声明
void CreatList(LinkList * L);//头插法建立链表
void CreatList1(LinkList * L);//尾插法建立链表
void InsertList(LinkList * L,int i ,int e);//插入结点
void DeleteList(LinkList * L,int i);//删除结点
void SearchList(LinkList * L,int i);//按位序查找结点
void DestoryList(LinkList * L);//销毁链表
void DestoryList(LinkList * L);//打印链表
//头插法建立单链表
void CreatList(LinkList * L){
LinkList p,s;
p=*L=(LinkList)malloc(sizeof(LNode)); //创建头结点
p->next=NULL; //将头节点的指针指向NULL,防止存在遗留的脏数据
int x;
printf("请输入元素,选择0即停止输入\n");
scanf("%d",&x);
while(x){
s=(LinkList)malloc(sizeof(LNode));//创建新的结点
s->data=x; //将数据赋值给新结点的数据域
s->next=p->next;
p->next=s;
scanf("%d",&x);
}
}
//尾插法创建单链表
void CreatList1(LinkList * L){
LinkList p,s;
*L=(LinkList)malloc(sizeof(LNode)); //创建头结点
p=*L; //创建一直指向表尾的指针
p->next=NULL; //将头节点的指针指向NULL,防止存在遗留的脏数据
int x;
printf("请输入元素,选择0即停止输入\n");
scanf("%d",&x);
while(x){
s=(LinkList)malloc(sizeof(LNode));//创建新的结点
s->data=x; //将数据赋值给新结点的数据域
p->next=s;
p=s;
scanf("%d",&x);
}
p->next=NULL;
}
//插入结点
void InsertList(LinkList * L,int i ,int e){
if(i<1)
return;
LNode * p=*L; //p为指向当前结点的指针
int j =0; //p指针指向的当前结点,当前位置为头结点
while(p!=NULL && j<i-1){
p=p->next;
j++;
}
LNode * s=(LNode *)malloc(sizeof(LNode)); //创建新结点
s->data = e;
s->next = p->next;
p->next =s;
}
//按位序查找结点
void SearchList(LinkList * L,int i){
if(i<1)
return;
LNode * p=*L; //p为指向当前结点的指针
int j =0; //p指针指向的当前结点,当前位置为头结点
while(p!=NULL && j<i-1){
p=p->next;
j++;
}
printf("该值为%d\n",p->next->data);
}
//删除结点
void DeleteList(LinkList * L,int i){
if(i<1)
return;
LNode * p=*L; //p为指向当前结点的指针
int j =0; //p指针指向的当前结点,当前位置为头结点
while(p!=NULL && j<i-1){
p=p->next;
j++;
}
if(p->next==NULL)
return;
LNode * s=(LNode *)malloc(sizeof(LNode));
s=p->next;
p->next=s->next;
free(s);
}
//销毁链表
void DestoryList(LinkList * L){
LinkList p,temp;
p=(*L)->next;//从第一个结点开始
while(p!=NULL){
temp=p->next;
free(p);
p=temp;
}
(*L)->next=NULL; //让头结点指针指向NULL
//free(*L); 销毁头结点;
}
//打印链表
void PrintList(LinkList L){
LinkList p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main(){
printf("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t请输入下列你想要的操作\t\t\n");
printf("\t\t1.创建链表\t\t\t2.插入结点\t\t\t3.删除结点\t\t\t\n\t\t4.按位查找\t\t\t5.销毁链表\t\t\t6.打印链表\n\t\t0.退出程序\n ");
int command,num;
int e;//输入的所需要查找的数值
int i,a,b,c;//a为输入插入的位置,b为插入的数值,c为需要删除的位置
LinkList L;
do{
scanf("%d",&command);
switch(command)
{
case 1:
printf("请选择头插法(1)还是尾插法(2)\n<1-2>\n");
scanf("%d",&num);
if(num==1) CreatList(&L);
else if(num==2) CreatList1(&L);
else printf("输入有误,请重新输入:");
break;
case 2: printf("请输入您需要插入的序列:\n");
scanf("%d",&a);
printf("请输入需要插入的元素:\n");
scanf("%d",&b);
InsertList(&L,a,b);
break;
case 3: printf("请输入您需要删除的内容的序号:");
scanf("%d",&c);
DeleteList(&L,c);
break;
case 4: printf("请输入需要查找的位置:");
scanf("%d",&i);
SearchList(&L,i);
break;
case 5: DestoryList(&L); break;
case 6: PrintList(L); break;
case 0: printf("退出成功"); break;
}
}while(command);
}