一:线性表
1.单链表应用
例子一:尾插入创立单链表,并且删除相同元素,即表示一个集合
#include<iostream>
using namespace std;
struct node
{
int num;
struct node *next;
};
node *head;
void creat_list()
{
int N,i;
cin>>N;
node*temp,*tail;
head=new node;
tail=head;
tail->next=NULL;
for(i=0;i<=N-1;i++)
{
temp=new node;
if(temp==NULL)
{
cout<<"memory allocate fail and exit";
exit(1);
}
cin>>temp->num;
tail->next=temp;
tail=temp;
tail->next=NULL;
}
}
void out_put_list()
{
node* a=head->next;
while(a!=NULL)
{
cout<<a->num<<" ";
a=a->next;
}
cout<<endl;
}
void delete_list()
{
node *p,*q,*r;
p=head->next;
while(p)
{
q=p;
while(q->next)
{
if((q->next)->num==p->num)
{
r=q->next;
q->next=r->next;
free(r);
}
else q=q->next;
}
p=p->next;
}
}
int main(void)
{
creat_list();
out_put_list();
delete_list();
out_put_list();
return 0;
}
例题二:把单链表L的元素按类型分为三个单链表
#include<iostream>
#include <ctype.h>
using namespace std;
typedef struct Lnode{
char data;
struct Lnode *next;
}Lnode,*LinkList;
typedef struct List{
LinkList head;
int n;
}List;
void InitLinkList(List &l)
{
l.head=new Lnode;
l.head->next=NULL;
l.n=0;
}//InitLinkList
void CreateLinkList(List &l)
{
cout<<"请输入链表的元素个数:";
cin>>l.n;
cout<<"请输入链表的元素:";
LinkList q=l.head;
for(int i=0;i<l.n;i++)
{
LinkList p=new Lnode;
cin>>p->data;
q->next=p;
q=p;
}
q->next=NULL;
}//CreateLinkList
void SplitLinkList(List &l,List &a,List &b,List &c)
{
LinkList s=l.head->next;
LinkList p=a.head;
LinkList q=b.head;
LinkList r=c.head;
while(s)
{
if(isalpha(s->data))
{
p->next=s;
p=s;
a.n++;
}
else if(isdigit(s->data))
{
q->next=s;
q=s;
b.n++;
}
else{
r->next=s;
r=s;
c.n++;
}
s=s->next;
}
p->next=NULL;
q->next=NULL;
r->next=NULL;
delete []l.head;
}//SplitLinkList
void ShowLinkList(List l)
{
cout<<"该链表的元素个数:"<<l.n<<endl;
cout<<"该链表的元素:";
LinkList p=l.head->next;
while(p)
{
cout<<p->data;
p=p->next;
}
cout<<endl;
}//ShowLinkList
int main(){
List l;
InitLinkList(l);
CreateLinkList(l);
List Sq1,Sq2,Sq3;//字母,数字,其他
InitLinkList(Sq1);
InitLinkList(Sq2);
InitLinkList(Sq3);
SplitLinkList(l,Sq1,Sq2,Sq3);
cout<<"字母字符链表如下:"<<endl;
ShowLinkList(Sq1);
cout<<"数字字符链表如下:"<<endl;
ShowLinkList(Sq2);
cout<<"其他字符链表如下:"<<endl;
ShowLinkList(Sq3);
return 0;
}
例子三:用拷贝构造函数及构造函数创建单链表,并逆序创建单链表
#include<iostream>
#include<iomanip>
using namespace std;
struct node
{
int score;
char num[15];
char name[20];
node *next;
};
class linklist{
private:
node *head;
node *tail;
int length;
public:
linklist(int m)
{
length=m;
head=new node;
head->next=NULL;
tail=head;
cout<<"Input "<<length<<" students'imformation of linklist you want:"<<endl;
cout<<left<<setw(20)<<"name"<<left<<setw(20)<<"num"
<<left<<setw(20)<<"score"<<endl;
int i;
for(i=0;i<=length-1;i++)
{
node *temp=new node;
cin>>temp->name>>temp->num>>temp->score;
temp->next=NULL;
tail->next=temp;
tail=temp;
}
}
void show()
{
if(length==0)
cout<<"It's an empty linklist!"<<endl;
else
{
node *t=head->next;
cout<<"Output "<<length<<" students'imformation of linklist:"<<endl;
cout<<left<<setw(20)<<"name"<<left<<setw(20)<<"num"
<<left<<setw(20)<<"score"<<endl;
while(t!=NULL)
{
cout<<left<<setw(20)<<t->name<<left<<setw(20)<<t->num
<<left<<setw(20)<<t->score<<endl;
t=t->next;
}
}
}
linklist(const linklist &s)
{
length=s.length;
head=new node;
head->next=NULL;
tail=head;
node *t=s.head->next;
while(t!=NULL)
{
node *temp=new node;
strcpy(temp->name,t->name);
strcpy(temp->num,t->num);
temp->score=t->score;
temp->next=NULL;
tail->next=temp;
tail=temp;
t=t->next;
}
}
~linklist()
{
node *r,*p;
if(length==0) delete head;
else
{
p=head->next;
while(head->next!=NULL)
{
r=p;
head->next=r->next;
delete r;
p=head->next;
}
delete head;
}
cout<<"delete....!"<<endl;
}
linklist()
{
head=new node;
head->next=NULL;
tail=head;
node *temp=new node;
strcpy(temp->name,"xiaodong");
strcpy(temp->num,"0825121006");
temp->score=85;
temp->next=NULL;
tail->next=temp;
tail=temp;
length=1;
}
void reverse_linklist()
{
node *q=head->next;
node *r=head;
node *s;
while(q->next!=NULL)
{
node *p=head;
while((p->next)->next!=NULL)
p=p->next;
s=r->next;
r->next=p->next;
(p->next)->next=s;
p->next=NULL;
r=r->next;
}
}
};
int main()
{
linklist list(5);
list.show();
linklist mylist(list);
mylist.show();
linklist youlist;
youlist.show();
list.reverse_linklist();
list.show();
return 0;
}
例子四:约瑟夫环顺序表实现代码
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct{
int ID;
int Code;
}ElemType;
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
void InitList_Sq(SqList &L){
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); //申请结点空间
if(!L.elem) exit(0); //申请失败,关闭程序
L.length=0; //空表长度为0
L.listsize=LIST_INIT_SIZE; //初始存储容量
}//InitList_Sq
void CreateList_Sq(SqList &L,int n){
if(n>L.listsize){ //判断存储空间是否足够
ElemType *base=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!base) exit(0); //不够再分配
L.elem=base; //指针指向新分配空间的首地址
L.listsize+=LISTINCREMENT; //修改存储容量
}
printf("请输入这%d人的密码(>0):",n);
for(int i=0;i<n;i++){
L.elem[i].ID=i+1;
scanf("%d",&(L.elem[i].Code)); //输入n个人的密码
}
L.length+=n; //修改表长度
}//CreateList_Sq
void DeleteList_Sq(SqList &L,int &m,int &start_pos){ //start_pos为新一轮报数的首个元素的下标
m=(start_pos+m)%L.length; //用取余数的方法寻找报数为m的元素,可减少搜索的次数
if(m==0) m=L.length; //如果报数为m的元素是数组的最后一个元素,要加上表的本身长度
start_pos=m-1; //记录下一轮开始报数的首元素的数组下标
ElemType *q=L.elem+L.length-1; //q指向最后一个元素
ElemType *p=&(L.elem[m-1]); //p指向报数为m的元素
printf("%d ",p->ID); //打印删除元素的编号,即出列编号
m=p->Code; //保存下一轮报数的密码
for(;p<q;p++) *p=*(p+1); //左移覆盖
--L.length; //修改表长
}//DeleteList_Sq
int main(){
SqList L;
int n,m,start_pos(0); //start_pos为新一轮报数的首元素的下标,初始化为0
printf("请输入初始报数(m>0):");
scanf("%d",&m);
while(m<=0){ //检查报数的合法性
printf("请重新输入初始报数(m>0):");
scanf("%d",&m);
}
printf("请输入用户数(0<n):");
scanf("%d",&n);
while(n<=0){ //检查用户数的合法性
printf("请重新输入用户数(n>0):");
scanf("%d",&n);
}
InitList_Sq(L); //初始化顺序表
CreateList_Sq(L,n); //创建顺序表
for(int i=n;i>=1;i--) //根据报数,删除报数为m的元素,并输出出列编号,
DeleteList_Sq(L,m,start_pos); //循环n次,即删除所有元素,顺序表为空时停止循环
printf("\n");
return 0;
}//main
例子五:约瑟夫环循环链表实现代码
#include<stdio.h>
#include<stdlib.h>
typedef struct{
int ID;
int Code;
}ElemType;
typedef struct Lnode{
ElemType elem;
struct Lnode *next;
}Lnode,*LinkList;
void CreateList_L(LinkList &L,int n){
L=(LinkList)malloc(sizeof(Lnode)); //申请结点空间
if(!L) exit(0); //申请失败,关闭程序
LinkList p=L;
printf("请输入这%d人的密码:",n);
for(int i=1;i<=n;i++){
p->elem.ID=i; //为这n个人编号
scanf("%d",&(p->elem.Code)); //输入每个人的密码
if(i==n) break; //如果i等于第n个人,无需再申请结点空间,跳出循环
p->next=(LinkList)malloc(sizeof(Lnode)); //申请下一个结点空间
if(!(p->next)) exit(0); //如果申请失败,关闭程序
p=p->next; //指针移动到下一个结点
}
p->next=L; //首尾相连,构成循环链表
}//CreateList_L
void DeleteList_L(LinkList &L,int &m,int Length){
int j=m%Length; //用取余数的方法寻找报数为m的结点,可减少循环
//遍历的次数
if(j==0||j==1) j+=Length; //如果m是首结点或是尾结点,要加上链表的本身长
//度,目的是寻找报数为m-1的结点,删除m结点就比较方便
int i=1;
while(i++<j-1) L=L->next; //寻找要删除结点的前驱结点
m=L->next->elem.Code; //先保存下一轮报数的密码
printf("%d ",L->next->elem.ID); //打印删除结点的编号,即出列编号
LinkList p=L->next; //保存要删除结点的地址
L->next=p->next; //断开删除结点,即出列,重新连接链表
L=L->next; //移动指针到下一个结点,等待下一轮新的报数
free(p); //删除报数为m的结点
}//DeleteList_L
void main(){
LinkList L=NULL; //初始化为空链表
int n,m;
printf("请输入初始报数(m>0):");
scanf("%d",&m);
while(m<=0){ //检查报数的合法性
printf("请重新输入初始报数(m>0):");
scanf("%d",&m);
}
printf("请输入用户数(0<n):");
scanf("%d",&n);
while(n<=0){ //检查用户数的合法性
printf("请重新输入用户数(n>0):");
scanf("%d",&n);
}
CreateList_L(L,n); //创建循环链表
for(int i=n;i>=1;i--) //根据报数,删除结点,输出出列编号,
DeleteList_L(L,m,i); //循环n次,即删除所有结点,链表为空时停止循环
printf("\n");
}//main
例子六:单链表建立及按顺序输出
#include<iostream>
#include<cstdlib>
using namespace std;
struct node
{
int data;
struct node *next;
};
void main(void)
{
const int N=10;
node *head,*temp,*tail;
head=new node;
head->next=NULL;
tail=head;
for(int i=0;i<=N-1;i++)
{
temp=new node;
if(temp==NULL)
{
cout<<"memory allocate fail and exit";
exit(1);
}
cin>>temp->data;
temp->next=NULL;
tail->next=temp;
tail=temp;
}
head=head->next;
int t;
node *p;
for(i=0;i<=N-2;i++)
{
for(int j=0;j<=N-i-2;j++)
{
if(head->data<(head->next)->data)
{
t=(head->next)->data;
(head->next)->data=head->data;
head->data=t;
}
if(j==0)
p=head;
head=head->next;
}
head=p;
}
while(head!=NULL)
{
cout<<head->data<<" ";
head=head->next;
}
cout<<endl;
}
例子七:建立单循环链表,并连接两个单循环链表
#include<iostream>
using namespace std;
struct node{
int data;
node *next;
};
class linklist{
private:
node *head;
node *rear;
int length;
public:
linklist(int n){
length=n;
head=new node;
head->next=head;
rear=head;
int i;
for(i=0;i<=length-1;++i){
node *temp=new node;
cin>>temp->data;
temp->next=head;
rear->next=temp;
rear=temp;
}
}
void show(){
node *s=head->next;
while(s!=head){
cout<<s->data<<" ";
s=s->next;
}
cout<<endl;
}
~linklist(){
if(length==0)
delete head;
else{
node *r;
while(head->next!=head){
r=head->next;
head->next=r->next;
delete r;
}
delete head;
}
cout<<"delete..........!"<<endl;
}
void connect_list(linklist &l){
node *front=new node;
front->next=front;
node *tail=front;
node *p=l.head->next;
while(p!=l.head){
node *temp=new node;
temp->data=p->data;
temp->next=front;
tail->next=temp;
tail=temp;
p=p->next;
}
rear->next=front->next;
tail->next=head;
delete front;
}
};
int main()
{
linklist a(4);
a.show();
linklist b(5);
b.show();
b.connect_list(a);
b.show();
return 0;
}
例子八:两个单链表互相连接
#include<iostream>
using namespace std;
struct node {
int data;
node *next;
};
class linklist {
private:
node *head;
node *rear;
int length;
public:
linklist(int n){
length=n;
head=new node;
head->next=NULL;
rear=head;
int i;
for(i=0;i<=length-1;++i){
node *temp=new node;
cin>>temp->data;
temp->next=NULL;
rear->next=temp;
rear=temp;
}
}
void show(){
node *s=head->next;
while(s!=NULL){
cout<<s->data<<" ";
s=s->next;
}
cout<<endl;
}
~linklist(){
if(length==0)
delete head;
else{
node *r;
while(head->next!=NULL){
r=head->next;
head->next=r->next;
delete r;
}
delete head;
}
cout<<"delete..........!"<<endl;
}
void connect_list(linklist &l){
node *h=new node;
h->next=NULL;
node *tail=h;
node *p=l.head->next;
while(p!=NULL){
node *temp=new node;
temp->data=p->data;
temp->next=NULL;
tail->next=temp;
tail=temp;
p=p->next;
}
rear->next=h->next;
delete h;
}
linklist(const linklist &l){
head=new node;
head->next=NULL;
rear=head;
node *p=l.head->next;
while(p!=NULL){
node *temp=new node;
temp->data=p->data;
temp->next=NULL;
rear->next=temp;
rear=temp;
p=p->next;
}
}
};
int main(){
linklist a(3);
a.show();
linklist b(5);
b.show();
linklist c(a);
a.connect_list(b);
a.show();
b.connect_list(c);
b.show();
return 0;
}
例子九:双向链表的头插入建表
#include<iostream>
using namespace std;
struct node{
int data;
node *next;
node *prior;
};
class linklist{
private:
node *head;
node *rear;
int length;
public:
linklist(int n){
length=n;
head=new node;
head->next=NULL;
rear=head;
node *temp=new node;
cin>>temp->data;
temp->prior=head;
temp->next=NULL;
head->next=temp;
rear=temp;
node *s=temp;
int i;
for(i=0;i<=length-2;++i){
node *temp=new node;
cin>>temp->data;
head->next=temp;
temp->prior=head;
temp->next=s;