由我自己写的单链表内容 下面是格式以及全部代码,随意使用吧!
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
//定义结点类型
struct Node{
int elem;
Node *next;
};
Node Head; //头结点
Node HeadA;
Node HeadB;
Node *DLList,*a,*b; //头指针
int T_times=0;//删除的计数器
void init(Node *DLList);
void display(Node *DLList);
void insert(Node *DLList);
void search(Node *DLList);
void del(Node *DLList);
void Turn(Node *DLList);
void slipt_a_b(Node *DLList);
void two_to_one(Node *DLList);
void read(Node *DLList);
void write(Node *DLList);
using namespace std;
int main()
{
char choice;
Head.elem=274523; //防止老师刁难人查找0
DLList=&Head; //使头指针指向头结点
a=&HeadA;
b=&HeadB;
a->next=NULL;
b->next=NULL;
Head.next=NULL;
while (1)
{
system("cls");
cout << "\n\n\n\n";
cout << "\t\t 单链表操作 \n";
cout << "\t\t======================================";
cout << "\n\n";
cout << "\t\t 1:初始化 \n";
cout << "\t\t 2:显示 \n";
cout << "\t\t 3:单个插入 \n";
cout << "\t\t 4:查找 \n";
cout << "\t\t 5:删除 \n";
cout << "\t\t 6: 线性表逆置 \n";
cout << "\t\t======================================pro \n";
cout << "\t\t 7: 自定义AB,合并 \n";
cout << "\t\t 8: 奇偶分离 \n";
cout << "\t\t 0:退出 \n";
cout << "\t\t r:通过文件录入 \n";
cout << "\t\t w:输出到文件里 \n";
cout << "\n";
cout << "\t\t请选择:" << flush;
choice = getch();
system("cls");
switch(choice)
{
case '1':
init(DLList);
break;
case '2':
display(DLList);
break;
case '3':
insert(DLList);
break;
case '4':
search(DLList);
break;
case '5':
del(DLList);
break;
case '0':
exit(0);
case '6':
Turn(DLList);
break;
case '7':
two_to_one(DLList);
break;
case '8':
slipt_a_b(DLList);
break;
case 'r':
read(DLList);
break;
case 'w':
write(DLList);
break;
}
}
}
//公用的等待函数
void wait()
{
cout << "请按任意键继续\n" << flush;
getch();
}
//屏幕提示后,从键盘输入线性表长度和随机数种子,生成以DLList为头指针的指定长度的线性表
void init(Node *DLList)
{
int length;
Node *p,*q;
while (1)
{
cout << "输入元素个数(0-" << 10000 << "):" << flush;
cin >> length;
if (length >= 0 && length <= 10000)
break;
cout << endl;
}
int i;
while (1)
{
cout << "输入随机数种子(0-32767):" << flush;
cin >> i;
if (i >= 0 && i <= 32767)
break;
cout << endl;
}
//从线性表中删除并释放原有的结点,使其成为空表
p=DLList;
while (p->next!=NULL)
{
q=p->next;
p->next=q->next;
free(q);
}
srand(i); //指定随机数种子,相同的种子将产生相同的数据序列
rand();
//向线性表插入length个新结点
for (int j=1;j<=length;j++)
{
p=new Node;
p->next=DLList->next;
DLList->next=p;
p->elem=rand() % 10000;
}
}
//在屏幕上依次显示以DLList为头指针的线性表中的全部元素和元素个数
//格式应便于观察
//如果需要指定输出的宽度,可以使用 cout << setw(W) << X ,其中 X 是输出的数值,W 是占据的列数
void display(Node *DLList)
{int i=1;//这是每一个东西的序号
while((DLList=DLList->next)!=NULL)//while dllist is not null, do loop
{ cout<<'/'<<i++<<'/'<<" "<<DLList->elem<<endl;//the number with ++
}
puts("完成了显示\n");
wait();
}
//屏幕提示后,从键盘输入一个元素值,然后把这个新元素插到以DLList为头指针的线性表的末尾
void inserts_for_slipt(Node *DLList,int newelem){
Node *add;
add=DLList;
while(add->next!=NULL)add=add->next;//find the end
add->next=(Node*) malloc(sizeof(Node));
add->next->elem=newelem;
add->next->next=NULL;
}
void inserts(Node *DLList){
int newelem;
Node *add;
add=DLList;
cout<<"输入插入值:"<<flush;
cin >> newelem;
while(add->next!=NULL)add=add->next;//find the end
add->next=(Node*) malloc(sizeof(Node));
add->next->elem=newelem;
add->next->next=NULL;
}
void insert(Node *DLList){
inserts(DLList);
wait();
}
//屏幕提示后,从键盘输入一个元素值,在以DLList为头指针的线性表中搜索这个元素
Node *shift_left;//searchs为后面的程序提供方便 原理和search类似
int searchs(Node *DLList,int search_thing){
Node *k,*left_k;//k for key
k=DLList;//the first is k now
while (k->elem!=search_thing){
if(k->next== NULL)break;
left_k=k;//save the left pointer for del function
k=k->next;
T_times++;
}
if((k->next== NULL)&&(k->elem!=search_thing))return -1;
else
{shift_left=left_k ;
return 1;
}
}
void search(Node *DLList)
{ int i=0;//i是序号
int search_thing;
cout <<"输入你要查找的数值:"<<endl;
cin >> search_thing;
Node *k,*left_k;//k for key
k=DLList;//the first is k now
while (k->elem!=search_thing){
if(k->next== NULL)break;
left_k=k;//save the left pointer for del function
k=k->next;
i++;
}
if((k->next== NULL)&&(k->elem!=search_thing))
{cout<<"找不到哦"<<endl;wait();}
else
{cout <<"找到了/"<<i<<'/'<<k->elem<<endl;
cout<<"查找次数为:"<<(i)<<"次"<<endl;
wait();}
shift_left=left_k ;
}
//屏幕提示后,从键盘输入一个元素值,在以DLList为头指针的线性表中删除这个元素
//屏幕显示删除成功与否的信息
void dels(Node *left)//用于其他函数引用 需要删除东东的上一个指针
{
Node *kill,*shift_right;
kill=left->next;//find the thing to kill
shift_right=left->next->next;
left->next=shift_right;//this two line is to connect
free(kill);
}
void del(Node *DLList)
{
Node *kill,*shift_right;
int flag;
int search_thing;
cout <<"输入你要删除的数值:"<<endl;
cin >> search_thing;
flag = searchs(DLList,search_thing);//*shift_left找到,*shift_left是我定义的全局变量
if(flag==-1){
cout <<"查无此数,无法删除"<<endl;
wait();return;
}
else {kill=shift_left->next;//find the thing to kill
shift_right=shift_left->next->next;
shift_left->next=shift_right;//this two line is to connect
free(kill);
cout <<"已经删除了掉,可以去显示那边看看"<<endl;
cout<<"查找次数为:"<<T_times<<"次"<<endl;
T_times=0;//计数器归零
wait();}
}
//6、将链接存储线性表逆置,即最后一个结点变成第1个结点,原来倒数第2个结点变成第2个结点,如此等等。
void Turn(Node *DLList){
Node *p,*q,*pr;
p = DLList->next;
q = NULL;
DLList->next = NULL;
while(p){
pr = p->next;
p->next = q;
q = p;
p = pr;
}
DLList->next = q;
Head=*DLList;
cout<<"线性表逆置完成了"<<endl;
wait();
}
//应用题
// 7、生成有序的两个单链表A和B(链表的数据和个数自定),其首结点指针分别为a和b
//,要求将两个单链表合并为一个有序的单链表C,其首结点指针为c,并且合并后的单链表的数据不重复。
void two_to_one(Node *DLList){
int i;
Node *p;
cout<<"输入a,5个数字:"<<endl;
for(i=0;i<5;i++)
{cout<<"等待第a"<<(i+1)<<"个数字:"<<flush;
inserts(a);}
cout<<"输入b,5个数字:"<<endl;
for(i=0;i<5;i++)
{cout<<"等待第b"<<(i+1)<<"个数字:"<<flush;
inserts(b);}
p=a;
while(p->next!=NULL)p=p->next;
p->next=b->next;
cout<<"a+b表结果:"<<endl;
display(a);
wait();
}
// 8、将一个首结点指针为a的单链表A分解成两个单链表A和B,其首结点指针分别为a和b,
//使得链表A中含有原链表A中序号为奇数的元素,而链表B中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。
void slipt_a_b(Node *DLList){
int i;
int x;
Node *A=DLList;
cout<<"继续使用链表(请不要用空表调戏)?(1继续/2新建):"<<flush;
cin>>i;
if(i!=1)
{ { Node *q, *p=DLList;
while (p->next!=NULL)
{
q=p->next;
p->next=q->next;
free(q);
}//先释放节点
}
cout<<"将会创建一个链表,从1一直到:"<<flush;
cin>>x;
for(i=0;i<x;i++)
inserts_for_slipt(A,i+1);}
display(A);
cout<<"==============================上面这是链表A"<<endl;
A=A->next;
i=1;//用来计数
while(1)
{
if(i%2==0){
inserts_for_slipt(b,A->elem);
}
else{
inserts_for_slipt(a,A->elem);
}
if(A->next==NULL)break;
i++;
A=A->next;
}
a=&HeadA;
cout<<"a(奇数):"<<endl;display(a);cout<<"a(奇数)表输出如上"<<endl;
cout<<"b(偶数):"<<endl; display(b);cout<<"b(偶数)表输出如上"<<endl;
a->next=NULL;
b->next=NULL;//初始化以便下次使用
}
void read(Node *DLList){
cout<<"在同一文件夹下的test.txt将会被写入程序(你可以先去新建一个test.txt)"<<endl;
int elem;
FILE *fp = NULL;
fp = fopen("test.txt", "r+");
while(fscanf(fp,"%d",&elem)!=EOF)
{
cout<<"sanf到的elem"<<elem<<endl;
inserts_for_slipt(DLList,elem);}
fclose(fp);
display(DLList);
}
void write(Node *DLList){
cout<<"在同一文件夹下的test.txt将会被写入"<<endl;
FILE *fp = NULL;
fp = fopen("test.txt", "w+");
while((DLList=DLList->next)!=NULL)//while dllist is not null, do loop
{
fprintf(fp,"%d ",DLList->elem);//the number with ++
}
fclose(fp);
cout<<"写--入--完--成--"<<endl;
wait();
}