目录
初始化
//单链表
typedef int ElemType;
typedef struct LNode{ //这时这个LNode 不能省略,因为在结构体中有结构体指针
ElemType data; //数据域
struct LNode *next; // 指针域
}LNode,*LinkList;
//单链表初始化
bool InitList(LinkList &L)
{
L = (LNode*)malloc(sizeof(LNode));
L->next=NULL;
return true;
}
求表长
//求表长
int LengthList(LinkList L)
{
int len=0;
LNode *p = L->next;
while(p!=NULL)
{
p=p->next;
len++;
}
return len;
}
按序号查找结点
//按序号查找结点
LNode *GetElem(LinkList L,int i) //头结点代表第 0 个结点
{
int j=0;
LNode *p = L;
while(p!=NULL && j<i)
{
p=p->next;
j++;
}
return p;
}
按值查找结点
//按值查找表结点
LNode *LocateElem(LinkList L,ElemType e)
{
LNode *p=L->next; //因为头结点中没有值,所以不用找,直接从L—>next 开始遍历
while(p!=NULL && p->data != e)
{
p=p->next;
}
return p;
}
插入结点(后插)
// 链表中插入结点 ,这是后插操作
bool ListInsert1(LinkList &L,int i,ElemType e)
{
LNode *p=L;
int j=0;
while(p!=NULL && j<i-1)
{
p=p->next;
j++;
}
if(p==NULL) //判断i的合法性
{
return false;
}
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
插入结点(前插)
// 链表中插入结点 ,这是前插操作
bool ListInsert2(LinkList &L,int i,ElemType e)
{
LNode *p=L;
int j=0;
while(p!=NULL && j<i)
{
p=p->next;
j++;
}
if(p==NULL) //判断i的合法性
{
return false;
}
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
int temp = p->data;
p->data = s->data;
s->data = temp;
return true;
}
删除结点(直接删除)
//链表中删除结点
//修改前驱结点的指针域,使其指向要删除元素的后继结点,再把要删元素所占用的空间free掉
bool ListDelete1(LinkList &L,int i,ElemType e)
{
LNode *p = L;
int j=0;
while(p!=NULL && j<i-1)
{
p=p->next;
j++;
}
if(p == NULL || p->next == NULL ) //p->next的意思是 最后一个位置的后面一个位置没有东西的怎么删
{
return false;
}
LNode *q = p->next;
e=q->data;
p->next = q->next;
free(q);
return true;
}
删除结点(间接删除)
要删结点和其后继结点的数据域交换,而后修改指针的值,最后free后继结点
//链表中删除结点
//可以将要删除结点的后继结点赋值给该结点,而后将后继结点free掉就可以
bool ListDelete2(LinkList &L,int i,ElemType e)
{
LNode *p = L;
int j=0;
while(p!=NULL && j<i)
{
p=p->next;
j++;
}
if(p == NULL)
{
return false;
}
LNode *q = p->next;
e=p->data;
p->data = q->data;
p->next = q->next;
free(q);
return true;
}
头插法建立单链表
//头插法新建单链表
LinkList List_HeadInsert(LinkList &L)
{
LNode *s;
int x;
L = (LNode*) malloc(sizeof(LNode));
L->next = NULL;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode*) malloc(sizeof (LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d",&x);
}
return L;
}
尾插法建立单链表
需要一个尾指针不断指向当前位置(即尾结点)
//尾插法新建单链表 必须增加一个尾指针,记录上一个插入节点的位置
LinkList List_TailInsert(LinkList &L)
{
LNode *s;
int x;
L= (LNode*) malloc(sizeof(LNode));
LNode *r = L;
L->next = NULL;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode*) malloc(sizeof(LNode));
s->data = x;
r->next =s;
r=s;
scanf("%d",&x);
}
r->next = NULL;
return L;
}
打印单链表
//打印单链表
void print(LinkList L)
{
LNode *s = L;
while(s->next != NULL)
{
s =s->next;
printf("%d ",s->data);
}
printf("\n");
}
总代码
#include <stdio.h>
#include <stdlib.h>
//单链表
typedef int ElemType;
typedef struct LNode{ //这时这个LNode 不能省略,因为在结构体中有结构体指针
ElemType data; //数据域
struct LNode *next; // 指针域
}LNode,*LinkList;
//单链表初始化
bool InitList(LinkList &L)
{
L = (LNode*)malloc(sizeof(LNode));
L->next=NULL;
return true;
}
//求表长
int LengthList(LinkList L)
{
int len=0;
LNode *p = L->next;
while(p!=NULL)
{
p=p->next;
len++;
}
return len;
}
//按序号查找结点
LNode *GetElem(LinkList L,int i) //头结点代表第 0 个结点
{
int j=0;
LNode *p = L;
while(p!=NULL && j<i)
{
p=p->next;
j++;
}
return p;
}
//按值查找表结点
LNode *LocateElem(LinkList L,ElemType e)
{
LNode *p=L->next; //因为tnd 头结点中没有值,所以不用找,直接从L—>next 开始遍历
while(p!=NULL && p->data != e)
{
p=p->next;
}
return p;
}
// 链表中插入结点 ,这是后插操作
bool ListInsert1(LinkList &L,int i,ElemType e)
{
LNode *p=L;
int j=0;
while(p!=NULL && j<i-1)
{
p=p->next;
j++;
}
if(p==NULL) //判断i的合法性
{
return false;
}
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
// 链表中插入结点 ,这是前插操作
bool ListInsert2(LinkList &L,int i,ElemType e)
{
LNode *p=L;
int j=0;
while(p!=NULL && j<i)
{
p=p->next;
j++;
}
if(p==NULL) //判断i的合法性
{
return false;
}
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
int temp = p->data;
p->data = s->data;
s->data = temp;
return true;
}
//链表中删除结点
//修改前驱结点的指针域,使其指向要删除元素的后继结点,再把要删元素所占用的空间free掉
bool ListDelete1(LinkList &L,int i,ElemType e)
{
LNode *p = L;
int j=0;
while(p!=NULL && j<i-1)
{
p=p->next;
j++;
}
if(p == NULL || p->next == NULL ) //p->next的意思是 最后一个位置的后面一个位置没有东西的怎么删
{
return false;
}
LNode *q = p->next;
e=q->data;
p->next = q->next;
free(q);
return true;
}
//链表中删除结点
//可以将要删除结点的后继结点赋值给该结点,而后将后继结点free掉就可以
bool ListDelete2(LinkList &L,int i,ElemType e)
{
LNode *p = L;
int j=0;
while(p!=NULL && j<i)
{
p=p->next;
j++;
}
if(p == NULL)
{
return false;
}
LNode *q = p->next;
e=p->data;
p->data = q->data;
p->next = q->next;
free(q);
return true;
}
//头插法新建单链表
LinkList List_HeadInsert(LinkList &L)
{
LNode *s;
int x;
L = (LNode*) malloc(sizeof(LNode));
L->next = NULL;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode*) malloc(sizeof (LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d",&x);
}
return L;
}
//尾插法新建单链表 必须增加一个尾指针,记录上一个插入节点的位置
LinkList List_TailInsert(LinkList &L)
{
LNode *s;
int x;
L= (LNode*) malloc(sizeof(LNode));
LNode *r = L;
L->next = NULL;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode*) malloc(sizeof(LNode));
s->data = x;
r->next =s;
r=s;
scanf("%d",&x);
}
r->next = NULL;
return L;
}
//打印单链表
void print(LinkList L)
{
LNode *s = L;
while(s->next != NULL)
{
s =s->next;
printf("%d ",s->data);
}
printf("\n");
}
int main() {
LinkList L;
List_TailInsert(L);
print(L);
ListInsert1(L,3,8);
print(L);
return 0;
}
//7 8 2 5 6 9999
测试样例
9999 表示结束
注:本文仅个人笔记,欢迎讨论交流
标签:结点,单链,LNode,int,next,基本操作,NULL,data From: https://blog.csdn.net/m0_73959411/article/details/137258206