lklist.h
#include<stdio.h>
#include<iostream>
using namespace std;
typedef int datatype;//结点数据类型,假设为int
typedef struct node* pointer;//结点指针类型
struct node {//结点结构
datatype data;
pointer next;
};
typedef pointer lklist;//单链表类型,即头指针类型
lklist creat2();//尾插法建表
lklist creat();//头插法建表
lklist initlist();//初始化
int length(lklist head);//求表长
pointer get(lklist head, int i);//按序号查找
pointer locate(lklist head, datatype x);//定位(按值查找)
int locate1(lklist head, datatype x);//定位(按值查找),定位时要求返回找到的结点号,没找到就返回-1(0代表头结点)
int insert(lklist head, datatype x, int i);//插入运算
int delete1(lklist head, int i);//删除运算
void destroy(lklist head);//销毁运算
lklist.cpp
#include"lklist.h"
lklist creat2() {//尾插法建表,有头结点,返回表头指针
pointer head, rear, s;
char ch;
head = new node;//生成头结点
rear = head;//尾指针初值指向头结点
while (cin >> ch, ch != '$') {//读入结点值,并检测是否为结束符
s = new node;//生成新结点
s->data = ch;
rear->next = s;//新结点插入表尾
rear = s;//尾指针rear指向新的表尾
}
rear->next = NULL;//尾结点的后继指针为空
return head;
}
lklist creat() {//头插法建表,有头结点,返回表头指针
lklist head;
pointer s;
char ch;
head = new node;//生成头结点,头指针初值指向头结点
head->next = NULL;
while (cin >> ch, ch != '$') {//输入结点值,并检测是否为结束符
s = new node;//生成新结点
s->data = ch;//装入数据
s->next = head->next;
head->next = s;//将新结点插入到头结点后
}
return head;
}
lklist initlist() {
pointer head;
head = new node;
head->next = NULL;
return head;
}
int length(lklist head) {
int j;
pointer p;
j = 0;//计数器
p = head->next;//从首结点开始搜索
while (p != NULL) {
j++;
p = p->next;//到下一个结点
}
return j;
}
pointer get(lklist head, int i) {//结点号i的有效范围是0≤i≤n
int j;
pointer p;
if (i == 0) return head;//0号结点为头结点
if (i < 0) return NULL;//位置非法,无此结点
j = 0;//计数器
p = head->next;//从首结点开始搜索
while (p != NULL) {
j++; if (j == i) break;
p = p->next;//没有搜索到第i个点,继续下一个结点
}
return p;//未找到是p自动为NULL
}
pointer locate(lklist head, datatype x) {
pointer p;
p = head->next;//从首结点开始搜索
while (p != NULL) {
if (p->data == x) break;
p = p->next;//到下一个结点
}
return p;
}
int locate1(lklist head, datatype x) {
int j;
pointer p;
j = 0;//计数器
p = head->next;//从首结点开始扫描
while (p != NULL) {
j++; if (p->data == x) break;//找到了x,退出循环
p = p->next;//没找到,继续扫描下一个结点
}
if (p != NULL) return j;//找到了x
else return -1;//没有x,查找失败
}
int insert(lklist head, datatype x, int i) {
pointer q, s;
q = get(head, i - 1);//找到第i-1个结点
if (q == NULL) { cout << "非法插入位置!\n"; return 0; }//无第i-1个结点,即i<1或i>n+1时
s = new node;//生成新结点
s->data = x;
s->next = q->next;//新结点的后继是原第i个点
q->next = s;//原第i-1个结点的后继是新结点
return 1;//插入成功
}
int delete1(lklist head, int i) {
pointer p, q;
q = get(head, i - 1);//找待删结点的直接前趋
if(q==NULL||q->next==NULL)//即i<1或i>n时
{
cout << "非法删除位置!\n"; return 0;
}
p = q->next;//保存待删结点的地址,用于释放空间
q->next = p->next;//修改前趋的指针
delete p;//释放已删除的结点空间
return 1;//删除成功
}
void destroy(lklist head) {
pointer p, q;
p = head;//从头结点开始
while (p != NULL) {
q = p->next;
delete p;
p = q;
}
}