目录
目录
单链表-动态分配链式存储结构
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ElemType char
typedef struct Snode{
ElemType data;//数据域
struct Snode *next;//指针域
}Snode,*ListSLink;//结点=数据域+指针域
基本操作
1.单链表—初始化
void ListSLink_Init(ListSLink &L){
L=(ListSLink)malloc(sizeof(Snode));//生成头结点
L->next=NULL;
printf("初始化成功\n");
}
2.创建单链表
void ListSLink_Creat(ListSLink &L)
{
ElemType data;
Snode *p=L;//创建指针指向头节点 方便后续遍历
printf("输入数据:\n");
scanf("%c",&data);
getchar();
while(data!='#'){
Snode *s=(Snode *)malloc(sizeof(Snode));//新建节点插入
s->next=p->next;
p->next=s;
s->data=data;
p=p->next;
printf("输入数据:\n");
scanf("%c",&data);
getchar();
}
}
3.单链表-求表长
int ListSLink_Length(ListSLink L){
int i=0;//计数器
Snode *p=L;//p指向头节点
while(p->next!=NULL){//若p的下一个节点不为空 则p指向p的下一个节点(遍历) 计数器++
i++;
p=p->next ;
}
return i;//返回计数值
}
4.单链表-按位插入
void ListSLink_Insert(ListSLink &L,int pos,ElemType newval){
int len=ListSLink_Length(L);//求表长
if(pos-1>len||pos<1){//若插入位置不合法,则程序异常退出
printf("链表插入失败\n");
exit(-1);
}
else{
Snode *p=L;//创建指针指向头节点 方便后续遍历
while(--pos){//指针指向要插入位置
p=p->next;
}
Snode *s=(Snode *)malloc(sizeof(Snode));//新建节点插入
s->data =newval;//为新节点数据赋值
s->next=p->next ;//插入链表中
p->next =s;
printf("链表插入成功\n");
}
}
5.单链表-按位删除
void ListSLink_Delete(ListSLink &L,int pos){
int len=ListSLink_Length(L);
if(pos-1>=len||pos<1){//若删除位不合法或表为空,程序异常退出
printf("链表删除失败\n");
exit(-1);
}
else{
Snode *p=L;//创建指针指向头节点 方便后续遍历
while(--pos){//指针指向要删除的位置
p=p->next;
}
Snode *s=p->next;
p->next=s->next;
free(s); //删除并释放节点
printf("链表删除成功\n");
}
}
6.单链表-查找-按值查找位
int ListSLink_Seek(ListSLink L,ElemType val){
int len=ListSLink_Length(L);//表长
int i=0;
Snode *p=L;//创建指针指向头节点 方便后续遍历
while(i!=len){//遍历整个单链表查找元素
if(p->next->data==val){//若查找成功 返回位号
printf("按值查找成功\n");
return i+1;
}
else{
p=p->next;
i++;
}
} //若遍历完整个链表未查找到值 则返回-1
printf("按值查找失败\n");
return -1;
}
7.单链表-判空
void ListSLink_Isvoid(ListSLink L){
if(L->next!=NULL){
printf("链表不为空\n");
}
else{
printf("链表为空\n");
}
}
8.单链表-销毁
void ListSLink_Destory(ListSLink &L){
Snode *p=L;//创建指针指向头节点 方便后续遍历
while(p->next!=NULL){//若下一个节点不为空 指针后移到下个节点 释放(删除)此节点
Snode *s=p;
p=p->next ;
free(s);
}
L->next=NULL;
printf("链表销毁成功\n");
}
9.单链表-打印
void ListSLink_Print(ListSLink L){
Snode *p=L;//创建指针指向头节点 方便后续遍历
while(p->next!=NULL){//若下一个节点不为空 则指针后移到下个节点 并打印数据
p=p->next;
printf("%c ",p->data);
}
}
代码实现结果
int main()
{
ListSLink L;
ListSLink_Init(L);//初始化单链表
ListSLink_Creat(L);//创建单链表
ListSLink_Insert(L,1,'A');//插入数据
ListSLink_Print(L);//打印单链表
printf("1在表中第%d位\n",ListSLink_Seek(L,'1'));
ListSLink_Delete(L,1);//按位删除
printf("单链表长度为:%d\n",ListSLink_Length(L));
ListSLink_Print(L);//打印单链表
ListSLink_Isvoid(L);//判空
ListSLink_Destory(L);//销毁单链表
}