ps: 大四跨考自学数据结构 权当笔记本 如有错误 可在评论区指正
首先 定义单链表
typedef struct LNode { //typedef +类型 + 自定义名
Elemtype *data; //Elemtype表示 任意类型的定义
struct LNode *next
};LNode,*LinkList; // 此结构 == typedef struct LNode LNode + typedef struct LNode* LinkList
操作一:按位序插入 (带有头结点)
在第i个位置插入元素 e
带头节点的情况 头节点的位序可以看作是 0
1.先判断i是否符合情况 i必须满足 i的取值情况是 第一个 到 最后一个+1
2.定义一个指针p表示当前扫描的结点 指向头结点
3.从第0个结点也就是头节点向后遍历 直到找到第i-1个结点
4.判断第i-1个结点是不是null,如果是 那么过界 插入失败
5.申请一个结点s 把e赋值给s结点 s结点指向p结点的后一个结点 p结点指向s结点 完成插入
bool ListInsret(LinkList L,int i,Elemtype e)
{ if(i<1) return false;
LNode *p ;
p = L;
int j = 0; //表示现在p指向第几个结点
while(p!=NULL && j<i-1) //找到第 i-1 个点
{
p->p->next;
j++
}
if(j == NULL) return false;
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
操作二:按位序插入 (不带头节点) 和带头节点的区别是 第一个结点需要 单独拿出来讨论
if(i == 1)
{
LNode *s= (LNode *)malloc(sizeof(LNode))
s->data = e;
s->next = L;
L = s;
}
操作三:指定结点的后插操作 在p后面插入节点 (给出的是节点p 和插入节点的值e)
p1
1.判断 p 是否在链表外
2. 插入
bool del(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前面插入节点s (给出的是节点p 和插入节点s)
p2
1. 先判断 s 和 p都不是NULL
2. 将s节点连接在p节点后
3. 将p的值和s的值交换
bool del(LNode *p,LNode *s)
{
if(p == NULL || s == NULL)
return false ;
s->next = p->next;
p->next = s;
ELemtype temp = s -> data;
s->data = p->data;
p->data = temp;
return true;
}
操作五:按位序删除 (带头节点)
bool del(LinkList &L,int i,Elemtype &e)
{
if(i<1)
return false ;
int j = 0;
LNode *p = L;
while(j < i-1&&p!=NULL)
{
p=p->next;
j++
}
if(p==NULL) return false;
LNode *q = p->next;
q->data = e;
p->next = q->next;
free(q);
return true;
}
操作六:指定节点的删除
bool del(LNode *p)
{
if(p == NULL)
return false;
LNode *q = p->next;
p->data = q->data ;
p->next = q->next;
free(q);
return true ;
}
操作七: 按位查找
LNode* GetElem (LinkList L,Elemtype i)
{
if(i<0) return NULL;
LNode *p;
p=L;
int j=0;
while(j < i&&p != NULL)
{ p=p->next;
j++;
}
return p; //如果p是NULL则返回NULL 否则返回 指向i的节点
}
操作八: 按值查找
LNode* LocateElem(LinkList L,Elemtype e)
{
LNode* p=L->next;
while(p != Null&&p->data!=e)
{ p=p->next;
}
return p;
}
操作九: 求表长
int length(LinkList L)
{
LNode *p;
p=L->next;
int length=0;
while(p!=NUll)
{ p=p->next;
length++;}
return length;
}
操作十 头插法
LinkList List_HeadInsret(LinkList &L)
{
LNode* s;
int x;
L = (LinkList)malloc(sizeof(LNode));//创建头节点
L->next == NULL;
scanf("%d",&x);
while(x!=9999) //设置一个值 表示结束
{ LNode* s=(LNode *) malloc(sizeof(LNode)); //创建新节点 对头节点实行后插
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d",&x);
}
return L;
}
操作十一 尾插法
LinkList List_TailInsret(LinkList &L)
{ int x;
scanf("%d",&x);
L = (LinkList)malloc(sizeof(LNode));
LNode *s,*r=L;// L是表尾指针
while(x!=9999)
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r ->next = s;//r指向新的表尾节点
r=s;
scanf("%d",&x); }
r->next = NULL;
return L;
}