线性表-单链表
【Elemtype为数据类型】
创建
链表结点结构体创建
typedef struct LNode //创建结点类型 { elemtype data; //结点中包含数据域 struct LNode *next; //结点中包含指向下一个结点的指针 }*Linklist //将该类型定义为一个链表(常使用指针方式价)
|
尾插法创建
void create(Linklist &L,int n)
{ L=new Lnode; L->next=NULL; Lnode *E=L; int i,a; Lnode *p; for(i=1;i<=n;i++) { cin>>a; p=new Lnode; p->data=a; E->next=p; p->next=NULL; E=p; } }
|
头插法创建
void create(Linklist &L,int n) //传址需要创建的表L,以及初始表长n { L=new LNode; L->next=NULL; int i,a; struct LNode *p; cin>>a; for(i=1;a!=-1;i++) { p=new LNode; p->data=a; p->next=L->next; L->next=p; cin>>a; } }
|
初始化
注:初始化应当在尾插和头插法前使用,或者不使用
bool init(Linklist &L) { L=new LNode; L->next=NULL; return true; }
|
取值
单链表的取值需要顺序遍历,耗时较长,故而不适合频繁获取特定位置的值
bool getelem(Linklist &L,int i,elemtype &e)
{ int j; LNode *p=L->next; for(j=1;j<i&&p!=NULL;j++) { p=p->next; } if(p==NULL) return false; e=p->next->data; return true; }
|
查找
单链表的查找同顺序表一样,需要遍历整个表,比较每个数据域和待查找值,若相同则返回其序号,若始终不相同则返回查找失败
bool find(Linklist &L,LNode *&p,elemtype a)
{ int j; p=L->next; for(j=1;p->next!=NULL;j++) { if(p->data==a) break; p=p->next; } if(p->next==NULL&&p->data!=a) return false; return true; }
|
插入
插入时,需要先让新结点连接需要插入位置前驱的后一个结点,再让前驱的next指针指向新结点,否则会直接丢失后面数据的地址
bool insert(Linklist &L,int i,elem e)
{ int j; Lnode *p=L->next; Lnode *s=new Lnode; s->data=e; for(j=0;j<i-1&&p!=NULL;j++) { p=p->next; } if(p==NULL) return false; s->next=p->next; p->next=s; return true; }
|
删除
bool del(Linklist &L,int i) { int j; Lnode *p=L->next; for(j=0;j<i-1&&p!=NULL) { p=p->next; } if(p=NULL) return false; p->next=p->next->next; return true; }
|
实际题目
R7-3 单链表的创建及遍历 (20 分)
读入n值及n个整数,建立单链表并遍历输出。
输入格式:
读入n及n个整数。
输出格式:
输出n个整数,以空格分隔(最后一个数的后面没有空格)。
输入样例:
在这里给出一组输入。例如:
输出样例:
在这里给出相应的输出。例如:
解法:
#include<iostream> using namespace std;
typedef struct Lnode { int data; struct Lnode *next; }*Linklist;
void create(Linklist &L,int n) { L=new Lnode; L->next=NULL; if(n>0) { Lnode *E=L; int i,a; struct Lnode *p; cin>>a; for(i=1;i<=n;i++) { p=new Lnode; p->data=a; E->next=p; p->next=NULL; E=p; cin>>a; } } }
int putout(Linklist &L) { int i; struct Lnode *p=L; if(L->next==NULL) return 0; for(i=0;p->next->next!=NULL;i++) { cout<<p->next->data<<" "; p=p->next; } cout<<p->next->data; return 0; }
int main() { Linklist list; int n; cin>>n; create(list,n); putout(list); return 0; }
|
R7-1 两个有序链表序列的合并 (20 分)
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
输出样例:
解法:
#include<iostream> using namespace std;
typedef struct Lnode { int data; struct Lnode* next; }*Linklist;
bool init(Linklist &L) { L=new Lnode; L->next=NULL; return true; }
void create(Linklist &L) { L=new Lnode; L->next=NULL; Lnode *E=L; int i,a; struct Lnode *p; cin>>a; for(i=1;a!=-1;i++) { p=new Lnode; p->data=a; E->next=p; p->next=NULL; E=p; cin>>a; } }
bool addit(Linklist &l1,Linklist &l2,Linklist &l3) { struct Lnode *p1=l1->next,*p2=l2->next, *p3; l3=l1; p3=l3; while(p1&&p2) { if(p1->data<=p2->data) { p3->next=p1; p3=p1; p1=p1->next; } else { p3->next=p2; p3=p2; p2=p2->next; } } p3->next=p1?p1:p2; return true; }
int putout(Linklist &L) { int i; struct Lnode *p=L; if(L->next==NULL) { cout<<"NULL"; return 0;} for(i=0;p->next->next!=NULL;i++) { cout<<p->next->data<<" "; p=p->next; } cout<<p->next->data; return 0; }
int main() { Linklist L1,L2,L3; create(L1); create(L2); init(L3); addit(L1,L2,L3); putout(L3); return 0; }
|
R7-2 两个有序链表序列的交集 (20 分)
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
输出样例:
解法:
#include<iostream> using namespace std;
typedef struct Lnode { int data; struct Lnode* next; }*Linklist;
bool init(Linklist &L) { L=new Lnode; L->next=NULL; return true; }
void create(Linklist &L) { L=new Lnode; L->next=NULL; Lnode *E=L; int i,a; struct Lnode *p; cin>>a; for(i=1;a!=-1;i++) { p=new Lnode; p->data=a; E->next=p; p->next=NULL; E=p; cin>>a; } }
bool find(Linklist &L,int a) { int j; struct Lnode *p; p=L->next; for(j=1;p->next!=NULL;j++) { if(p->data==a) break; p=p->next; } if(p->next==NULL&&p->data!=a) return false; return true; }
bool cutit(Linklist &l1,Linklist &l2,Linklist &l3) { struct Lnode *p1=l1->next,*p2=l2->next,*p3=l3; while(p1&&p2) { if(p1->data<p2->data) { p1=p1->next; } else if(p1->data==p2->data) { p3->next=p1; p3=p3->next; p1=p1->next; p2=p2->next; } else if(p1->data>p2->data) { p2=p2->next; } } if(p3->next!=NULL) p3->next=NULL; return true; }
int putout(Linklist &L) { int i; struct Lnode *p=L; if(L->next==NULL) { cout<<"NULL"; return 0;} for(i=0;p->next->next!=NULL;i++) { cout<<p->next->data<<" "; p=p->next; } cout<<p->next->data; return 0; }
int main() { Linklist L1,L2,L3; create(L1); create(L2); init(L3); cutit(L1,L2,L3); putout(L3); return 0; }
|