归纳了单链表的一些主要算法,加深对链表的理解,更好地了解指针。
#include<iostream>
using namespace std;
typedef struct Node{
int data;
struct Node *next;
}Node,*Dlink;
/*
创建单链表(有头结点)
*/
Dlink CreateDlink(){
Node *p,*q,*head;
head=q=(Node *)malloc(sizeof(Node));
for(int i=0;i<6;i++){
p=(Node *)malloc(sizeof(Node));
p->data=i;
q->next=p;
q=p;
}
q->next=NULL;
return head;
}
Dlink CreateDlink2(){
Node *p,*q,*head;
head=q=(Node *)malloc(sizeof(Node));
for(int i=13;i<19;i++){
p=(Node *)malloc(sizeof(Node));
p->data=i;
q->next=p;
q=p;
}
q->next=NULL;
return head;
}
/*
基本操作
*/
//1.插入数据到单链表
void InsertData(Dlink s,int x){
//1.尾插法
Node *n,*k=(Node *)malloc(sizeof(Node));
if(!k){
cout<<"内存不足"<<endl;
}
k->data=x;
n=(Node *)malloc(sizeof(Node));
n=s->next;
while(n->next!=NULL){
n=n->next;
}
n->next=k;
k->next=NULL;
}
void InsertData2(Dlink s,int x){
//2.头插法
Node *m,*p;
p=(Node *)malloc(sizeof(Node));
if(!p){
cout<<"内存不足!!!"<<endl;
}
p->data=x;
m=s->next;
p->next=m;
s->next=p;
}
//2.删除数据
void DeleteData(Dlink s,int x){ //a.直接删除某个值的元素
Node *p,*q,*k=s->next;
q=(Node *)malloc(sizeof(Node));
while(k!=NULL){
if(k->data==x){
q=k;
break;
}
k=k->next;
}
if(k!=NULL){
p=s;
while(p->next!=q){
p=p->next;
}
p->next=q->next;
free(q);
}
else{
cout<<"没有这个元素!!!!"<<endl;
}
}
void DeleteData2(Dlink s,int i){ //b.直接删除某个位置上的元素
Node *q,*pp=(Node *)malloc(sizeof(Node));
pp=s;
for(int count=0;count<i;count++){
q=pp;
pp=pp->next;
}
q->next=pp->next;
free(pp);
}
//3.得到特定值所在的位置
int getlocationFromData(Dlink s,int data){
Node *h=s;
int count=0;
while(h->next!=NULL){
h=h->next;
count++;
if(h->data==data){
break;
}
}
if(h->data!=data){
return -1;
}
return count;
}
//4.统计链表中的元素个数
int CountNum(Dlink s){
int i=0;
Node *node=s->next;
while(node!=NULL){
i++;
node=node->next;
}
return i;
}
//5.排序从小到大
void SortDlink(Dlink s){
int x;
Node *p,*q;
p=s;
q=s;
while(p->next!=NULL){
p=p->next;
while(q->next!=NULL){
q=q->next;
if(p->data<
q->data){
x=p->data;
p->data=q->data;
q->data=x;
}
if(q->next==NULL){
q=s;
break;
}
}
}
}
//6.打印
void PrintDlink(Dlink s){
Node *p;
p=s->next;
while(p!=NULL){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//7.两条单链表的合并
Dlink DlinkCombine(Dlink s1,Dlink s2){
Node *m,*n;
m=s1;
n=s2;
while(m->next!=NULL){
m=m->next;
}
m->next=n->next;
return s1;
}
void Menu(){
cout<<"=============================="<<endl;
cout<<"=====1.创建链表"<<endl;
cout<<"=====2.统计链表结点个数"<<endl;
cout<<"=====3.删除指定位置的结点"<<endl;
cout<<"=====4.返回特定值的位置"<<endl;
cout<<"=====5.头插法插入数据"<<endl;
cout<<"=====6.尾插法插入数据"<<endl;
cout<<"=====7.单链表的冒泡排序"<<endl;
cout<<"=====8.删除指定值的结点"<<endl;
cout<<"=====9.打印"<<endl;
cout<<"=====10.两条单链表的合并"<<endl;
cout<<"=====11.退出"<<endl;
cout<<"=====请选择操作================"<<endl;
}
void main(){
Dlink s;
int k,choice,flag=1;
s=(Dlink)malloc(sizeof(Node));
while(flag){
Menu();
cin>>choice;
switch(choice){
case 1:
s=CreateDlink();
break;
case 2:
if(s==NULL){
cout<<"请先创建链表!!!!!"<<endl;
break;
}
cout<<"结点个数是==>"<<CountNum(s)<<endl;
break;
case 3:
if(s==NULL){
cout<<"请先创建链表!!!!!"<<endl;
break;
}
cout<<"请输入您要删除的位置!!!"<<endl;
cin>>k;
if(k>CountNum(s)){
cout<<"ERROR!!!!!"<<endl;
break;
}
DeleteData2(s,k);
break;
case 4:
if(s==NULL){
cout<<"请先创建链表!!!!!"<<endl;
break;
}
cout<<"请输入要查找位置的值"<<endl;
cin>>k;
cout<<"它的位置是:"<<getlocationFromData(s,k)<<endl;
break;
case 5:
cout<<"请输入要插入的数据"<<endl;
cin>>k;
InsertData2(s,k);
break;
case 6:
cout<<"请输入要插入的数据"<<endl;
cin>>k;
InsertData(s,k);
break;
case 7:
if(s==NULL){
cout<<"请先创建链表!!!!!"<<endl;
break;
}
SortDlink(s);
break;
case 8:
if(s==NULL){
cout<<"请先创建链表!!!!!"<<endl;
break;
}
cout<<"请输入要删除的数据"<<endl;
cin>>k;
DeleteData(s,k);
break;
case 9:
PrintDlink(s);
break;
case 10:
s=DlinkCombine(s,CreateDlink2());
break;
case 11:
cout<<"谢谢您的测试!!!!"<<endl;
flag=0;
break;
}
}
}