33,311
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
using namespace std;
typedef char datatype; //结点数据类型
typedef struct node * pointer; //结点指针类型
struct node //结点结构
{
datatype data;
pointer next;
};
typedef pointer lklist; //单链表类型 头指针类型
//初始化
lklist initlist()
{
lklist head;
head=new node;
head->next=NULL;
return head;
}
//尾插法建表
lklist t_creat()
{
lklist head;
pointer rear,s;
char ch;
head=new node;
rear=head; //尾指针赋值为头指针的地址
cout<<"输入一个字符,以 # 结束:";
cin>>ch;
while(ch!='#')
{
cout<<"输入一个字符,以 # 结束:";
s=new node; //创建一个新结点
s->data=ch;
if(head==NULL)head=s;
else rear->next=s; //非表空的时候,新结点*s插入到尾节点之后
rear=s; //尾指针rear指向新的表尾
cin>>ch;
}
if(rear!=NULL)
rear->next=NULL;
return head;
}
//头插法建表
lklist h_creat()
{
lklist head;
pointer s;
char ch;
head=new node; //生成新结点
cout<<"输入一个字符,以 # 结束:";
cin>>ch;
while(ch!='#')
{
cout<<"输入一个字符,以 # 结束:";
s = new node;
s->data = ch;
s->next = head->next; //新结点插入到头结点后
head->next = s;
cin>>ch;
}
return head;
}
//求表长
int length(lklist head)
{
int nIndex;
pointer p;
nIndex=0; //计数器
p=head->next; //从首节点开始搜索
while(p!=NULL)
{
nIndex++;
p=p->next; //到下一个结点
}
return nIndex;
}
//按序号查找 查找第i个
pointer Get(lklist head,int i)
{
int j;
pointer p;
if(i < 0)
return NULL; //非法插入位置
j = -1; //计数器
p = head;
while(p!= NULL)
{
j++;
if(j==i)break;
p = p->next; //没有搜索到第 i 结点
}
return p;
}
//按值(x) 查找 (定位)
int locate(lklist head,datatype x)
{
int j;
pointer p;
j = 0; //计数器
p=head->next; //从首节点开始搜索
while(p!=NULL)
{
j++;
if(p->data==x)
break;
p=p->next; //到下一结点
}
if(p->data==x)
return j; //找到了x
else return -1; //没有找到 x
}
//插入
int insert(lklist head,datatype x,int i)
{
pointer p,s;
p = Get(head,i-1); //找到第 i 个结点
if(p==NULL)
{cout<<"插入错误!!\n";return 0;}
s = new node; //生成新结点
s->data = x;
s->next = p->next; //新结点的后继是院第 i 个结点
p->next = s; //原 i-1 个结点的后继是新结点
return 1;
}
//删除
int Delete(lklist head,int i)
{
pointer p,q;
q=Get(head,i-1);
if(q==NULL||q->next==NULL)
{cout<<"删除失败!!\n";return 0;}
p = q->next; //保存待删结点,释放空间
q->next = p->next;
delete p;
return 1;
}
//销毁
void destory(lklist &LK)
{
pointer p,q;
p = LK->next;
while(p!=NULL)
{
q = p->next;
delete p; //删除节点
p = q;
}
LK = NULL;
}
//显示链表内容
void display(lklist head)
{
if(head==NULL)
{
cout<<"链表不存在!"<<endl;
return ;
}
pointer p;
p = head->next;
cout<<"链表中的元素依次是:";
while(p != NULL)
{
cout<<p->data<<' ';
p=p->next;
}
cout<<endl;
}
int main()
{
lklist Lk;
cout<<"调用t_creat函数,创建链表:"<<endl;
Lk=t_creat();
display(Lk);
cout<<"调用length函数,链表的长度是:"<<length(Lk)<<endl;
insert(Lk, 'x',3);
cout<<"调用insert函数,在第3个位置插入字符x之后。";
display(Lk);
cout<<"调用Get函数,获取链表的第4个元素得到是:";
pointer p = Get(Lk,4);
cout<<p->data<<endl;
cout<<"调用locate函数,查找链表中的字符d,得到在链表的第"<<locate(Lk,'d')<<"的位置。"<<endl;
Delete(Lk, 2);
cout<<"调用Delete函数,删除第2个位置的字符之后。";
display(Lk);
destory(Lk);
cout<<"调用destory函数,销毁链表后。";
display(Lk);
return 0;
}