定义单链表
typedef struct LNode{
int data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
头插法
LinkList CreatList1(LinkList &L){
LNode *s; //辅助指针
int x; //存储插入结点的数据的值
L=(LinkList)malloc(sizeof(LNode)); //创建头结点
L->next=NULL; //初始为空链表
scanf("%d",&x); //输入结点的值
while(x!=-1){ //输入-1表示结束
s=(LNode*)malloc(sizeof(LNode)); //创建新结点
s->data=x; //对新结点的数据域赋值
s->next=L->next; //新结点的后继指向第一结点
L->next=s; //头结点的后继指向新结点
scanf("%d",&x); //读入下一结点值
}
return L;
}
尾插法
LinkList CreatList2(LinkList &L){
int x;
L=(LinkList)malloc(sizeof(LNode));
LNode *s, *r=L; //r为表尾指针 指向表尾
scanf("%d",&x); //输入结点的值
while(x!=-1){ //输入-1表示结束
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s; //r指向新的表尾结点
scanf("%d",&x);
}
r->next=NULL; //尾结点指针置空
return L;
}
按序号查找
在单链表中从第一个结点出发,顺指针next域逐个往下搜索,直到找到第i个结点为止,否则返回最后一个结点指针域NULL
LNode *GetElem(LinkList L,int i){
int j=1; //计数,初始为1
LNode *p=L->next; //第一个结点指针赋给p
if(i==0) return L; //若i==0,则返回头结点
if(i<1) return NULL; //这里也可以写i<0,若i无效,则返回NULL
while(p&&j<i){ //从第一个结点开始查找,查找第i个结点
p=p->next;
j++;
}
return p; //返回第i个结点的指针,如果i大于表长,直接返回p
}
按值查找
从单链表第一个结点开始,由前往后依次比较表中各结点数据域的值,若某结点数据域的值等于给定值e,则返回该结点的指针,
若整个单链表中没有这样的结点,则返回NULL
LNode *LocataElem(LinkList L,int e){
LNode *p=L->next;
while(p!=NULL&&p->data!=e){ //从第一个结点开始查找data域为e的结点
p=p->next;
}
return p; //找到后返回该结点指针,否则返回NULL
}
插入
插入操作是将值为i的新结点插入到单链表的第i个位置上,先检查插入位置的合法性,然后找到待插入位置的前驱结点,即第i-1个结点,再在其后插入新结点。
算法思路:
1、取指向插入位置的前驱结点的指针 ①p=GetElem(L,i-1);
2、令新结点*s的指针域指向*p的后继节点 ②s->next=p->next;
3、令结点*p的指针域指向新插入的结点*s ③p->next=s;
删除:
删除操作是将单链表的第i个结点删除。先检查删除位置的合法性,然后查找表中第i-1个结点,即被删结点的前驱结点,再将其删除
算法思路:
1、取指向删除位置的前驱结点的指针 ①p=GetElem(L,i-1);
2、取指向删除位置的指针 ②q=p->next;
3、p指向结点的后继指向被删除结点的后继 ③p->next=q->next;
4、释放删除结点 ④free(q);
两个有序链表序列的合并(完整c++代码)
#include<bits/stdc++.h>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList CreatList(){
LinkList L,s,r;
L=(LNode*)malloc(sizeof(LNode));
r=L;
int x;
scanf("%d",&x);
while(x!=-1){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
void Merge(LinkList A,LinkList B,LinkList &C)
{
LinkList p=A->next;
LinkList q=B->next;
LinkList r;
r=C=A;
while(p!=NULL&&q!=NULL)
{
if(p->data<=q->data)
{
r->next=p;
r=p;
p=p->next;
}
else{
r->next=q;
r=q;
q=q->next;
}
}
r->next=p?p:q;
free(B);
}
void Print(LinkList C){
LinkList p=C->next;
if(!p){
printf("NULL");
}else{
printf("%d",p->data);
p=p->next;
}
while(p){
printf(" %d",p->data);
p=p->next;
}
}
int main(){
LinkList A,B,C;
A=CreatList();
B=CreatList();
Merge(A,B,C);
Print(C);
return 0;
}
运行结果