1.建立链表
1.1头插法
LinkList List_HeadInsert(){
//生成头结点
LinkList L = (LinkList)malloc(sizeof(LNode));
L->next=NULL;
int n;
printf("请输入要生成链表的长度\n");
cin>>n;
cout<<"倒序输入数据"<<endl;
for(int i=0; i<n; i++){
LinkList s = (LinkList)malloc(sizeof(LNode));
cin>>s->data;
s->next = L->next;
L->next = s;
}
return L;
}
1.2尾插法
LinkList List_TailInsert(){
LinkList L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
LNode * r=L; //尾指针
int n;
cout<<"请输入要生成的链表的长度"<<endl;
cin>>n;
cout<<"正序输入数据"<<endl;
for(int i=0; i<n; i++){
LinkList s =(LinkList)malloc(sizeof(LNode));
cin>>s->data;
s->next = NULL;
r->next = s;
r = r->next;
}
return L;
}
2.结点插入
Status ListInsert_L(LinkList &L, int i, ElemType e){
LNode * p = L;
int j=0;
//尝试找位置
while(p && j<i-1 ){
p = p->next;
j++;
}
if(p && j<i-1) return false; //i<1 或者 i>链表长度都会进入判断
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
3.结点删除
3.1通过结点位置
Status ListDelete_L(LinkList & L, int i, ElemType &e){
LNode * p = L;
int j=0 ;
while( p->next && j<i-1){
p = p->next;
j++;
}
if(p->next && j<i-1) return false;
LNode * q = p->next;
e = q->data;
p->next = p->next->next;
free(q);
return true;
}
3.2通过结点数值(数值一样全删)
Status ListDelete_L2(LinkList & L, ElemType e){
LNode *p = L;
bool flag=false;
while(p->next){
if(p->next->data == e){
LNode *q = p->next;
p->next = p->next->next;
free(q);
flag = true;
}else{ //如果删除了一次,不能向后移动指针
p = p->next;
}
}
return flag;
}
4. 查找 和 更改
4.1 查找
Status ListFind_L(LinkList & L, int i ,ElemType &e){
LNode *p = L;
int j=0;
while(p && j<=i-1){ //此处与插入处不同
p = p->next;
j++;
}
if(p && j<i-1) return false; //i<1或者i大于总长度
e = p->data;
return true;
}
4.2 插入
Status ListChange_L(LinkList & L, int i ,ElemType &e){
LNode *p = L;
int j=0;
while(p && j<=i-1){ //此处与插入处不同
p = p->next;
j++;
}
if(p && j<i-1) return false; //i<1或者i大于总长度
p->data = e ; //此处和查找相反
return true;
}
5. 合并有序单链表(两个升序)
void MergeList_L(LinkList &La, LinkList & Lb, LinkList & Lc){
LinkList pa = La->next;
LinkList pb = Lb->next;
LinkList pc;
Lc = La;
pc = Lc;
while(pa && pb){ //两个链表都有,就得比较
if(pa->data <= pb->data){
pc->next = pa;
pc = pa;
pa = pa->next;
}else{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
//其中一个链表结束了,剩下的那个拼起来就是结果
while(pa){
pc ->next = pa;
pc = pa;
pa = pa->next;
}
while(pb){
pc ->next = pb;
pc = pb;
pb = pb->next;
}
free(Lb);
}
6.合体总代码!
#include <stdio.h>
#include <iostream>
using namespace std;
#define ElemType int
#define Status bool
typedef struct LNode{
ElemType data;
struct LNode * next;
} LNode, * LinkList;
//打印单链表
Status Printf_List(LinkList L){
cout<<"打印数据-----------------"<<endl;
L = L->next;
while(L!=NULL){
cout<<L->data<<" ";
L = L->next;
}
cout<<endl;
}
//建立单链线性表L
//头插法
LinkList List_HeadInsert(){
//生成头结点
LinkList L = (LinkList)malloc(sizeof(LNode));
L->next=NULL;
int n;
printf("请输入要生成链表的长度\n");
cin>>n;
cout<<"倒序输入数据"<<endl;
for(int i=0; i<n; i++){
LinkList s = (LinkList)malloc(sizeof(LNode));
cin>>s->data;
s->next = L->next;
L->next = s;
}
return L;
}
//尾插法
LinkList List_TailInsert(){
LinkList L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
LNode * r=L; //尾指针
int n;
cout<<"请输入要生成的链表的长度"<<endl;
cin>>n;
cout<<"正序输入数据"<<endl;
for(int i=0; i<n; i++){
LinkList s =(LinkList)malloc(sizeof(LNode));
cin>>s->data;
s->next = NULL;
r->next = s;
r = r->next;
}
return L;
}
//结点插入
Status ListInsert_L(LinkList &L, int i, ElemType e){
LNode * p = L;
int j=0;
//尝试找位置
while(p && j<i-1 ){
p = p->next;
j++;
}
if(p && j<i-1) return false; //i<1 或者 i>链表长度都会进入判断
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
//结点删除 通过结点位置
Status ListDelete_L(LinkList & L, int i, ElemType &e){
LNode * p = L;
int j=0 ;
while( p->next && j<i-1){
p = p->next;
j++;
}
if(p->next && j<i-1) return false;
LNode * q = p->next;
e = q->data;
p->next = p->next->next;
free(q);
return true;
}
//结点删除 通过结点数值,数值一样全部删除
Status ListDelete_L2(LinkList & L, ElemType e){
LNode *p = L;
bool flag=false;
while(p->next){
if(p->next->data == e){
LNode *q = p->next;
p->next = p->next->next;
free(q);
flag = true;
}else{ //如果删除了一次,不能向后移动指针
p = p->next;
}
}
return flag;
}
//查找 根据下标找数据
Status ListFind_L(LinkList & L, int i ,ElemType &e){
LNode *p = L;
int j=0;
while(p && j<=i-1){ //此处与插入处不同
p = p->next;
j++;
}
if(p && j<i-1) return false; //i<1或者i大于总长度
e = p->data;
return true;
}
// 更改 和 查找 及其相似
Status ListChange_L(LinkList & L, int i ,ElemType &e){
LNode *p = L;
int j=0;
while(p && j<=i-1){ //此处与插入处不同
p = p->next;
j++;
}
if(p && j<i-1) return false; //i<1或者i大于总长度
p->data = e ;
return true;
}
// 两个有序的链表合并成一个有序的链表, 序列为非递减
void MergeList_L(LinkList &La, LinkList & Lb, LinkList & Lc){
LinkList pa = La->next;
LinkList pb = Lb->next;
LinkList pc;
Lc = La;
pc = Lc;
while(pa && pb){ //两个链表都有,就得比较
if(pa->data <= pb->data){
pc->next = pa;
pc = pa;
pa = pa->next;
}else{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
//其中一个个链表结束了,剩下的那个拼起来就是结果
while(pa){
pc ->next = pa;
pc = pa;
pa = pa->next;
}
while(pb){
pc ->next = pb;
pc = pb;
pb = pb->next;
}
free(Lb);
}
int main(int argc, char** argv) {
// LinkList a = List_TailInsert();
// LinkList b = List_TailInsert();
// Printf_List(a);
// Printf_List(b);
// LinkList c;
// MergeList_L(a, b, c);
// Printf_List(c);
return 0;
}