Linklist.h 头文件
#ifndef LINKLIST_H
#define LINKLIST_H
typedef char ElemType;
typedef struct Node //结点类型定义
{
ElemType data;
struct Node* next;
}Node, *LinkList; //Linklist为结构指针类型
Node *Locate( LinkList L,ElemType key);
bool InsList(LinkList L,int i,ElemType e);
bool DelList(LinkList L,int i,ElemType &e);
int ListLength(LinkList L);
LinkList CreateFromHead();
LinkList CreateFromTail();
void display(LinkList L);
void InsiistTail(LinkList L,ElemType e) ;
Node *Get(LinkList L, int i);
#endif
Linklist.cpp
#include "LinkList.h"
#include <iostream>
#include<cstdlib>
using namespace std;
Node *Locate( LinkList L,ElemType key)//按值在单链表中查找
{
Node *p=L->next;
while(p)
{
if(p->data==key) return p;
p= p->next;
}
return NULL;
}
bool InsList(LinkList L,int i,ElemType e)//在链表的第i个结点前插入
{
Node *pre=L;
int j = 0;
while(pre&& j<i-1){
pre=pre->next;
j++;//结点个数加1
}
if(pre==NULL) return false;//插入位置不合法
Node *s=new Node;//分配空间
s->data = e;
s->next = pre->next;
pre->next =s;//s放到pre后面
return true;
}
bool DelList(LinkList L,int i,ElemType &e)//删除第i个结点,第i结点的值存到e中
{
Node *pre=L;
int j = 0;
while(pre&& j<i-1){
pre=pre->next;
j++;//结点个数加1
}
if(pre==NULL||pre->next==NULL) return false;
Node *p=pre->next; //第i
e = p->data;
pre->next=p->next;
delete p;
return true;
}
int ListLength(LinkList L) //计算单链表的长度
{
int c = 0;
Node *p=L->next;
while(p)
{
c++;
p=p->next;
}
return c;
}
LinkList CreateFromHead()//头插法建立单链表
{
Node *L = new Node; //为头结点分配空间
Node *s;
L->next = NULL; //指针域为空
char c; //读取字符
while(1)
{
cin>>c;
if(c=='$') break;
s = new Node; //s指向新的结点
s->data = c;
s->next=L->next; //s的指向L
L->next=s; //L 的next指向s
}
return L;
}
LinkList CreateFromTail()//插法建立单链表
{
Node *L=new Node;
Node *s,*r=L;
L->next=NULL;
char c;
while(1)
{
cin>>c ;
if(c=='$') break;
s = new Node;
s->data =c;
r->next =s;//链接到表尾
r =s;
}
r->next =NULL;
return L;
}
void display(LinkList L)//遍历链表
{
Node *p = L->next;//指向链表的第一个结点
while(p) //p不为空的话
{
cout<<p->data<<" " ;
p=p->next;
}
}
void InsiistTail(LinkList L,ElemType e) //在链表尾插入一个元素
{
Node *p = L;//指向链表的头结点
while(p->next) //后面有结点的话 即后面不为空
{
p=p->next;
}
Node *s=new Node;
s->data =e;
s->next =NULL;//指针与先放一个空值
p->next =s;
}
Node *Get(LinkList L, int i)//查找链表的第i个结点
{
Node *p =L;//头结点
int j=0;
while(p&&j<i){
p=p->next;
j++;
}
return p;
}
main主函数
#include<iostream>
#include "LinkList.h"
using namespace std;
int main()
{
Node *L=CreateFromHead(); //L作为链表头指针
display(L);
cout<<endl;
// char c;
// cout<<"input";
// cin>>c;
// Node *p=Locate(L,c);
// if(p==NULL) cout<<"not find";
// else cout<<"find";
// bool re=InsList(L,3,'u');
// if(re==false) cout<<"插入失败";
// else
// {
// display(L);
// }
// char c;
// bool re =DelList(L,5,c);
//
// if(re==false) cout<<"shibai";
// else
// {
// display(L);
//
// }
//
// InsiistTail(L,'9');
// cout<<endl;
// display(L);
Node *p=Get(L,5);
if(p==NULL) cout<<"shibai ";
else cout<<p->data;
return 0;
}