单链表
最近在准备考研,先复习的数据结构。这里是***单链表***部分代码。
之前对复习到指针部分还有些地方不太理解,自己去实现一个结构之后就完全理解了。
所以有对指针部分有疑惑的小伙伴可以去实际的项目实现中理解,个人觉得会更容易!
```c
#include<stdio.h>
#include<stdlib.h>
//单链表的定义
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//单链表的创建&&头插法
bool ListCreateHead(LinkList &L) { //逆向建立单链表
L = (LNode *)malloc(sizeof(LNode)); //创建头结点
if (L == NULL) //内存不足,分配失败
return false;
L->next = NULL; //头节点指向NULL 完成初始化
LNode *p;
int x;
scanf_s("%d", &x);
while (x != 9999) //输入9999表示输入结束
{
p = (LNode*)malloc(sizeof(LNode)); //创建新结点
p->next = L->next;
L->next = p;
p->data = x; //新结点接在头结点之后
scanf_s("%d", &x); //不断接收输入的数据
}
return true;
}
//单链表的创建&&尾插法
bool ListCreateTail(LinkList &L) { //正向建立单链表
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL; //完成初始化
LNode *r=L,*s; //s指向为不断新增的结点,r为指向表尾指针
int x;
scanf_s("%d", &x);
while (x!= 9999)
{
s = (LinkList)malloc(sizeof(LNode));
r->next = s;
s->data= x; //在r结点之后插入元素x
r = s; //r指向新的表尾结点
scanf_s("%d", &x); //不断接收新输入
}
r->next = NULL; //表尾指针指向NULL
return true;
}
//在第i个位置上插入元素e
bool InsertElem(LinkList &L, int i, ElemType e) {
if (i < 1)
return false;
LNode *p; //指针p指向当前扫描到的结点
p = L; //L为头结点,头结点为第0个
int m = 0; //当前p指向的是第m个结点
while (p!=NULL&&m < i-1) //循环找到第i-1个结点
{
p = p->next;
m++;
}
if (p == NULL) //i值不合法
return false;
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s; //将结点s连接在p之后
return true; //插入成功
}
//在p结点后插入元素e
bool InsertElem_phou(LNode *p, ElemType e) {
if (p == NULL)
return false;
LNode *s= (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
//在p结点前插入元素e:结点还是插到p之后,让p的前继结点的数据域为e,新插入的结点数据域=p->data
bool InsertElem_pqian(LNode *p, ElemType e) {
if (p == NULL)
return false;
LNode *s = (LNode*)malloc(sizeof(LNode));
s->next = p->next;
p->next = s;
s->data = p->data;
p->data = e;
return true;
}
//删除第i个结点,并把值返回到e中
bool deleteElem(LinkList &L, int i, int&e) {
if (i < 1)
return false;
LinkList p; //结点p指向当前扫描到的结点
p = L; //L为头结点,第0个
int m=0; //计数,当前p指向第m个结点
while (p!=NULL&&m < i - 1) { //循环找到第i-1个结点
p = p->next;
m++;
}
if (p == NULL) //i值不合法
return false;
if(p->next==NULL) //第i-1个结点之后已无其他结点
return false;
LNode *s = p->next;
e = s->data;
p->next = s->next;
free(s);
return true;
}
//删除指定结点p
bool DeleteNode(LNode*p) {
if (p == NULL)
return false;
LNode *s = p->next;
p->data = p->next->data;
p->next = s->next;
free(s);
return true;
}
//查找第i个位置的元素值
bool GetElem(LinkList L, int i, ElemType &e) {
if (i < 1)
return false;
LinkList p;
p = L;
int m = 0;
while (p!=NULL&&m<i) //循环找到第i个结点
{
p = p->next;
m++;
}
if (p==NULL)
return false;
e = p->data;
return true;
}
//查找数据域位e的结点(位置)
bool LocalElem(LinkList L, ElemType e, int &n) {
LinkList p;
p = L;
int m = 0;
while (p!=NULL)
{
if (p->data == e)
{
n = m;
return true;
}
p = p->next;
m++;
}
if (p == NULL)
return false;
}
bool PrintList(LinkList L) {
LinkList p = L->next;
while (p != NULL) {
printf("%d\n", p->data);
p = p->next;
}
return true;
}
int main(void)
{
LinkList L;
ListCreateTail(L);
PrintList(L);
int e;
deleteElem(L, 3, e);
printf("%d", e);
PrintList(L);
system("pause");
return 0;
}