1.建立链表
1.1头插法1.2尾插法 2.结点插入3.结点删除
3.1通过结点位置3.2通过结点数值(数值一样全删) 4. 查找 和 更改
4.1 查找4.2 插入 5. 合并有序单链表(两个升序)6.合体总代码!
1.建立链表 1.1头插法linkList List_HeadInsert(){
//生成头结点
linkList L = (linkList)malloc(sizeof(LNode));
L->next=NULL;
int n;
printf("请输入要生成链表的长度n");
cin>>n;
cout<<"倒序输入数据"<>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<<"请输入要生成的链表的长度"<>n;
cout<<"正序输入数据"<>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 && jnext;
j++;
}
if(p && j链表长度都会进入判断
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 && jnext;
j++;
}
if(p->next && jnext;
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 && jdata;
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 && jdata = 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#include 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<<"打印数据-----------------"< next; while(L!=NULL){ cout< data<<" "; L = L->next; } cout< next=NULL; int n; printf("请输入要生成链表的长度n"); cin>>n; cout<<"倒序输入数据"< >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<<"请输入要生成的链表的长度"< >n; cout<<"正序输入数据"< >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 next; j++; } if(p && j 链表长度都会进入判断 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 next; j++; } if(p->next && j 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 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 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; }



