按位序插入(带头结点)
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {//一个结点带一个数据域和一个指针
int data ;
struct LNode *next;
}LNode,*LinkList;
//在第i个位置插入元素e
bool ListInsert(LinkList& L, int i, int e) {
if (i < 1) {
return false;
}
LNode* P;
int j = 0;//表示现在在哪个结点
P = L; //P指向链表的头结点
while (P != NULL && j < i - 1) { //找到要插入结点的前一个结点
P = P->next; //往后找
j++;
if (P == NULL) {
return false; //如果找不到 i值不合法
}
//找到了第i-1个结点
LNode* s = (LNode*)malloc(sizeof(LNode));//开辟一个新的空间(此空间为LNode类型,带有数据域和指针)
s->data = e;//将需要插入的e放入数据域中
s->next = P->next; //s的next指针指向此时P得next所指向的数据域
P->next = s;
return true;
}
按位序插入(不带头结点)
struct LNode
{
struct LNode* next;
int data;
};
bool InsertList(LNode* &L,int i,int e) {
if (i == 1) { //若要在头结点处插入数据
LNode* s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = L;
L = s ; //头结点指向新结点
}
LNode* p;
int j = 0;
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}
if (p == NULL) {
return false;
}
LNode* s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
指定结点的前插操作
#include<stdio.h>
#include<stdlib.h>
struct LNode
{
int data;
LNode* next;
};
//法1:
bool InsertPriorNode(LNode* p, int e) {
if (p == NULL) {
return false;
}
LNode* s = (LNode*)malloc(sizeof(LNode));
if (s == NULL) {
return false;
}
s->next = p->next;
p->next = s;
s->data = p->data;
p->data = e;
return true;
}
//法2:
bool InsertPriorNode2(LNode* p, LNode* s) {
if (p == NULL || s == NULL) {
return false;
}
s->next = p->next;
p->next = s;
int temp=p->data;
p->data = s->data;
s->data = temp;
return true;
}
}
按位序删除
#include<stdio.h>
#include<stdlib.h>
struct LNode
{
int data;
LNode* next;
};
//带头指针
bool Delete(struct LNode*& L, int i, int &e) {//要把数据带回所以用引用
if (i < 1) {
return false;
}
LNode* p;
p = L;
int j = 0;
while (p != NULL && j < i-1) { //找到前驱结点
p = p->next;
j++;
}
if (p == NULL) {
return false; //如果找不到
}
LNode* q = p->next; //找个指针指向要删除的元素
e = q->data;
p->next = q->next;
free(q);
return true;
}
//不带头指针
bool Delete1(struct LNode*& L, int i, int& e) {
if (i < 1) {
return false;
}
//如果删除第一个元素
LNode* p = L;
int j = 0;
if (i == 1) {
LNode* s = p;
s->data = e;
p = p->next;
L = p;
free(s);
}
while (p != NULL && j < i - 1) { //找到前驱结点
p = p->next;
j++;
}
if (p == NULL) {
return false; //如果找不到
}
LNode* q = p->next; //找个指针指向要删除的元素
e = q->data;
p->next = q->next;
free(q);
return true;
}
删除指定位置结点
#include<stdio.h>
#include<stdlib.h>
struct LNode
{
int data;
LNode* next;
};
bool Delete(LNode* p) {
if (p == NULL) {
return false;
}
LNode* q = p->next;
p->data = q->data;
p->next = q->next;
free(q);
return true;
}