数据结构 算法 我花了一学期整理的

本文提供了多个单链表操作的示例代码,包括单链表的创建、排序、元素删除等,展示了如何通过C++实现这些基本的数据结构操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:线性表

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值