数据结构-工具包-单链表

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;
	}
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字50 设计师:CSDN官方博客 返回首页