单链表链表操作

//头文件
#include<stdio.h>
#include<stdlib.h>
//单链表数据类型定义
typedef struct List{
char data;
struct List *next;
}ListCode,*LinkList;
//主函数
int main()
{
LinkList L; //或者 *ListCode L
InitList(L); //初始化结点
system(“pause”);
return 0;
}

链表初始化

bool InitList(LinkList &L){ //初始化链表
L = (ListCode*)malloc(sizeof(LinkList));
if(L==NULL)
return false;
L->next = NULL;
return true;
}

在指定的位置插入数据

bool InsertList(LinkList &L,int i,char s){ //插入链表数据 L是链表,i是插入位置,s是插入的数据
if(i<0){ //增强代码的健壮性
return false;
}
//↓这段代码用于做插入的准备工作
int j=0; //先定义一个j用来作为哨兵
ListCode H; //定义一个指针,用来作为哨兵指针
H = L; //先让指针和头指针相等
while(j<i-1){ //两个哨兵相互配合,找到插入位置的前一个位置,并令哨兵指针指向插入位置的前一个位置
H=H->next;
j++;
}
//↓这段代码做插入
LinkList p = (ListCode
)malloc(sizeof(ListCode)); //定义新结点
p->data = s; //把要插入的数据先存入该结点
p->next = H->next; //先做后继结点的链接
H->next = p; //再做前面结点的链接 (两个链接不能交换位置,不然插入结点讲无限指向自己)
return true;
}

在指定指针位置插入元素

bool InsertPriorNode(ListCode *p,char e){ //在指定指针位置插入数据
if(p==NULL){ //增强代码健壮性
return false;
}
LinkList L = (LinkList)malloc(sizeof(ListCode)); //向内存申请一个新的结点
L->next = p->next; //↓把新结点放在插入结点后面
p->next = L; //↑把新结点放在插入结点后面
L->data=p->data; //把指定结点的数据放在新节点
p->data=e; //把要插入的数据放在指定结点
return true;
}

删除指定位置的元素

bool ListDelete(LinkList &L,int i){ //删除第i个结点
if(i<1){
return false;
}
int j=0;
ListCode *p;
p=L;
while(j<i-1){
p=p->next;
j++;
}
ListCode *q = p->next;
p->next=q->next;
printf(“删除%c完成\n”,q->data);
free(q);
return true;
}

删除指定指针位置的元素 (单链表没有办法删除最后一个结点)
由于单链表无法知道指定位置的前驱结点,所以只能用偷梁换柱的方法删除指定指针位置的节点

bool DeleteNode(LinkList &L,ListCode *p){ //删除指定指针位置的元素
if(p->next==NULL)
{
printf(“不能删除最后一个结点我很菜\n”);
return true;
}
ListCode *q = p->next; //把后继结点的元素放在指定位置,再把后继结点删除(偷梁换柱)
p->data = q->data;
p->next = q->next;
printf(“已经删除指定指针位置的元素%c”,q->data);
free(q);
return true;
}

打印链表

void printList(LinkList &L){ //打印该链表
ListCode *p;
p=L;
for(int i=0;;i++)
{
p=p->next;
if(p!=NULL)
{
printf("%c\n",p->data);
}
else
{
printf(“打印单链表完成”);
return;
}
}
}

按照下标值查找元素

bool GetElem(LinkList &L,int i){ //查找该链表的第i个元素
if(i<1){
printf(“查找的元素位置应该是正整数”);
return true;
}
ListCode *p = L;
int j = 0;
for(j;j<i;){
p=p->next;
j++;
}
printf(“第%d个元素为%c\n”,i,p->data);
return true;
}

按照指定值查找元素

bool LocateElem(LinkList &L,char e){ //查找指定元素
int j=0;
ListCode *p=L;
while(p!=NULL)
{
if(p->data==e)
{
printf(“您要查到的%c元素在第%d个位置\n”,e,j);
return true;
}
p=p->next;
j++;
}
printf(“链表里没有您要查找的元素\n”);
return true;
}

返回数组长度

int Length(LinkList &L){
int length=0;
ListCode *p=L;
for(;😉){ //这是两个引号
if(p->next!=NULL)
{
p=p->next;
length++;
}
else
{
return length;
}
}
}
整体代码
#include<stdio.h>
#include<stdlib.h>
typedef struct List{
char data;
struct List *next;
}ListCode,*LinkList;

bool InitList(LinkList &L){ //初始化链表
L = (ListCode*)malloc(sizeof(LinkList));
if(L==NULL)
return false;
L->next = NULL;
return true;
}

bool InsertList(LinkList &L,int i,char s){ //插入链表数据 L是链表,i是插入位置,s是插入的数据
if(i<0){ //增强代码的健壮性
return false;
}
//↓这段代码用于做插入的准备工作
int j=0; //先定义一个j用来作为哨兵
ListCode H; //定义一个指针,用来作为哨兵指针
H = L; //先让指针和头指针相等
while(H!=NULL&&j<i-1){ //两个哨兵相互配合,找到插入位置的前一个位置,并令哨兵指针指向插入位置的前一个位置
H=H->next;
j++;
}
//↓这段代码做插入
LinkList p = (ListCode
)malloc(sizeof(ListCode)); //定义新结点
p->data = s; //把要插入的数据先存入该结点
p->next = H->next; //先做后继结点的链接
H->next = p; //再做前面结点的链接 (两个链接不能交换位置,不然插入结点讲无限指向自己)
return true;
}

bool InsertPriorNode(ListCode *p,char e){ //在指定指针位置插入数据
if(p==NULL){ //增强代码健壮性
return false;
}
LinkList L = (LinkList)malloc(sizeof(ListCode)); //向内存申请一个新的结点
L->next = p->next; //↓把新结点放在插入结点后面
p->next = L; //↑把新结点放在插入结点后面
L->data=p->data; //把指定结点的数据放在新节点
p->data=e; //把要插入的数据放在指定结点
return true;
}

bool ListDelete(LinkList &L,int i){ //删除第i个结点
if(i<1){
return false;
}
int j=0;
ListCode *p;
p=L;
while(j<i-1){
p=p->next;
j++;
}
ListCode *q = p->next;
p->next=q->next;
printf(“删除%c完成\n”,q->data);
free(q);
return true;
}
bool DeleteNode(LinkList &L,ListCode *p){ //删除指定指针位置的元素
if(p->nextNULL)
{
printf(“不能删除最后一个结点我很菜\n”);
return true;
}
ListCode *q = p->next; //把后继结点的元素放在指定位置,再把后继结点删除(偷梁换柱)
p->data = q->data;
p->next = q->next;
printf(“已经删除指定指针位置的元素%c”,q->data);
free(q);
return true;
}
void printList(LinkList &L){ //打印该链表
ListCode *p;
p=L;
for(int i=0;;i++)
{
p=p->next;
if(p!=NULL)
{
printf("%c\n",p->data);
}
else
{
printf(“打印单链表完成”);
return;
}
}
}
bool GetElem(LinkList &L,int i){ //查找该链表的第i个元素
if(i<1){
printf(“查找的元素位置应该是正整数”);
return true;
}
ListCode *p = L;
int j = 0;
for(j;j<i;){
p=p->next;
j++;
}
printf(“第%d个元素为%c\n”,i,p->data);
return true;
}
bool LocateElem(LinkList &L,char e){ //查找指定元素
int j=0;
ListCode *p=L;
while(p!=NULL)
{
if(p->data
e)
{
printf(“您要查到的%c元素在第%d个位置\n”,e,j);
return true;
}
p=p->next;
j++;
}
printf(“链表里没有您要查找的元素\n”);
return true;
}

int Length(LinkList &L){
int length=0;
ListCode *p=L;
for(;😉{
if(p->next!=NULL)
{
p=p->next;
length++;
}
else
{
return length;
}
}
}
int main()
{
LinkList L; //或者 *ListCode L
InitList(L); //初始化结点
char *a=“abc”;
InsertList(L,1,a[0]);
InsertList(L,2,a[1]);
InsertList(L,3,a[2]);
printf("%d\n",Length(L));
system(“pause”);
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值