#include<stdio.h>
#include<malloc.h>
typedef char ElemType;
typedef struct LNode
{
ElemType data; //存放元素值
struct LNode *next; //指向后继结点
}LinkNode; //声明单链表节点类型
void CreateListF(LinkNode *&L, ElemType a[], int n)//头插法建立单链表
{
LinkNode *s;
L = (LinkNode *)malloc(sizeof(LinkNode));//创建头结点
L->next = NULL; //创建头结点,其next域值为NULL
for (int i = 0; i < n; i++) //循环建立数据结点s
{
s = (LinkNode *)malloc(sizeof(LinkNode));//创建新结点
s->data = a[i]; //创建数据结点s
s->next = L->next; //将结点s插在原开始结点之前,头结点之后
L->next = s;
}
}
void CreateListR(LinkNode *&L, ElemType a[], int n)//尾插法建立单链表
{
LinkNode *s, *r;
L = (LinkNode *)malloc(sizeof(LinkNode));//创建头结点
L->next = NULL;
r = L; //r始终指向尾结点,开始是指向头结点
for (int i = 0; i < n; i++) //循环建立数据结点s
{
s = (LinkNode *)malloc(sizeof(LinkNode));//创建新结点s
s->data = a[i]; //创建数据结点s
r->next = s; //将结点s插入r结点之后
r = s;
}
r->next = NULL; //尾结点的next域值为NULL
}
void InitList(LinkNode *&L) //初始化线性表
{
L = (LinkNode*)malloc(sizeof(LinkNode)); //创建头结点
L->next = NULL; //创建头结点,其next域值为NULL
}
void DestroyList(LinkNode *&L)//销毁线性表
{
LinkNode *pre = L, *p = pre->next;//pre指向结点p的前驱结点
while (p != NULL) //扫描单链表L
{
free(pre); //释放pre结点
pre = p; //pre、p同步后移一个结点
p = pre->next;
}
free(pre); //循环结束时p为NULL,pre指向尾结点,释放它
}
bool ListEmpty(LinkNode *L) //判断线性表是否为空
{
return(L->next == NULL);
}
int ListLength(LinkNode *L) //求线性表的长度
{
int i = 0;
LinkNode *p = L; //p指向头结点,n置为0(即头结点的序号为0)
while (p->next != NULL)
{
i++;
p = p->next;
}
return i; //循环结束时,p指向尾结点,其序号n为结点个数
}
void DispList(LinkNode *L) //输出线性表
{
LinkNode *p = L->next; //p指向首结点
while (p != NULL) //p不为NULL,输出p结点的data域
{
printf("%c", p->data);
p = p->next; //p移向下一个结点
}
printf("\n");
}
bool GetElem(LinkNode *L, int i, ElemType &e)//求线性表中的某个数据元素值
{
int j = 0;
LinkNode *p = L; //p指向头结点,j置为0(即头结点的序号)
if (i <= 0) return false; //i错误返回假
while (j < i&&p != NULL) //找第i个结点
{
j++;
p = p->next;
}
if (p == NULL) //不存在第i个结点
return false;
else //存在第i个结点
{
e = p->data; //当j=i时,将这个元素的值赋给e
return true;
}
}
int LocateElem(LinkNode *L, ElemType e)//按元素查找
{
int i = 1;
LinkNode *p = L->next; //p指向首结点,i置1(即首结点的序号为1)
while (p != NULL && p->data != e) //查找data值为1的结点,其序号为i
{
p = p->next;
i++;
}
if (p == NULL) //不存在值为e的结点,返回0
return 0;
else //存在值为e的结点,返回逻辑序号i
return i;
}
bool ListInsert(LinkNode *&L, int i, ElemType e)//插入第i个数据元素
{
int j = 0;
LinkNode *p = L, *s; //指向头结点,j置0(即头结点的序号为0)
if (i <= 0)
return false;
while (j < i - 1 && p != NULL) //查找第i-1个结点
{
j++;
p = p->next;
}
if (p == NULL) //未找到第i-1个结点,返回false
return false;
else //找到第i-1个结点p,插入新结点并返回true
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = e; //创建新结点s,其域值为e
s->next = p->next; //将s结点插入到结点p之后
p->next = s;
return true;
}
}
bool ListDelete(LinkNode *&L, int i, ElemType &e)//删除第i个元素
{
int j = 0;
LinkNode *p = L, *q; //p指向头结点,j置为0(即头结点的序号为0)
if (i <= 0)
return false; //i错误返回假
while (j < i - 1 && p != NULL) //查找第i-1个结点
{
j++;
p = p->next;
}
if (p == NULL) //未找到第i-1个结点,返回false
return false;
else //找到第i - 1个结点p
{
q = p->next; //q指向第i个结点
if (q == NULL) //若不存在第i个结点,返回false
return false;
e = q->data;
p->next = q->next; //从单链表中删除q结点
free(q); //释放q结点
return true; //返回true表示成功删除第i个结点
}
}
int main()
{
LinkNode *h;
ElemType e;
printf("单链表的基本运算如下:\n");
printf(" (1) 初始化单链表h\n");
InitList(h);
printf(" (2)依次采用尾插法插入a,b,c,d,e元素\n");
ListInsert(h, 1, 'a');
ListInsert(h, 2, 'b');
ListInsert(h, 3, 'c');
ListInsert(h, 4, 'd');
ListInsert(h, 5, 'e');
printf(" (3)输出单链表h:\n");
DispList(h);
printf(" (4)单链表h长度:%d\n", ListLength(h));
printf(" (5)单链表h为%s\n", (ListEmpty(h) ? "空":"非空"));
GetElem(h, 3, e);
printf(" (6)单链表h的第3个元素:%c\n", e);
printf(" (7)元素a的位置:%d\n", LocateElem(h, 'a'));
printf(" (8)在第4个元素位置上插入f元素\n");
ListInsert(h, 4, 'f');
printf(" (9)输出单链表h:\n");
DispList(h);
printf(" (10)删除h的第3个元素\n");
ListDelete(h, 3, e);
printf(" (11)输出单链表h:\n");
DispList(h);
printf(" (12)释放单链表h\n");
DestroyList(h);
return 1;
}
...
#include<iostream.h> typedef int ElemType; typedef struct LNode { ElemType data; //存放结点数据 struct LNode *next; //指向下一个同类型节点指针 }linklist; //单链表节点类型 //1.建立链表 void jianli(linklist *&L,int W) //创...
1. 单链表的数据抽象类型 对于单链表来说,它是线性表的一种存储结构,当我们把单链表的数据对象,数据关系,数据操作描述出来后,然后就可以考虑基本操作的实现了。 ADT ——线性表: 2. 单链表的基本运算实现 1.初始化线性表InitList(L) InitList()运算用于建立一个空的单链表,即创建一个头节点,这个头结点一...
实现单链表的基本运算:初始化、插入、删除、求表的长度、判空、释放。 (1)初始化单链表L,输出L->next的值; (2)依次采用尾插法插入元素:输入分两行数据,第一行是尾插法需要插入的字符数据的个数,第二行是具体插入的字符数据。 (3)输出单链表L; (4)输出单链表L的长度; (5)判断单链表L是否为空; (6)输出单链表L的第3个元素; (7)输出元素a的位置; (8)在第4个元素位置...
【代码】//文件名:sqstack.cpp...
sqstring.cpp中源程序代码: 测试程序代码:...
##单链表基本运算的笔记(可供一些初学者学习) (1)初始化单链表L。 (2)依次采用尾插法插入h、e、l、l、o。 (3)输出单链表L。 (4)输出单链表L的长度。 (5)判断单链表L是否为空。 (6)输出单链表L的第2个和第4个元素。 (7)输出元素o位置。 (8)在单链表L的第4个位置上插入元素r。 (9)输出单链表L。 (10)删除单链表L的第3个元素。 (11)输出单链表L。 (12)释...
编写一个程序exp2-2.cpp,实现单链表的各种基本运算(假设单链表的元素类型为char) 并在此基础上完成如下功能: (1)初始化单链表h; (2)采用尾插法依次插入元素a,b,c,d,e; (3)输出单链表h; (4)输出单链表h长度; (5)判断单链表h是否为空; (6)输出单链表h的第3个元素; (7)输出元素a的位置; (8)在第4个元素位置上插入元素f; (9)输出单链表h; (10...
...
判断是否是回文有三种方法: 一、 先使指针指向字符串中第一个元素和最后一个元素,进行比较: 如果不相同,则不是回文,返回 False; 如果相同,两边指针各往中间移动一个单位,继续比较。 若两指针相遇,证明字符串对称的位置元素相同,也就是回文,返回True 代码如下: 二、回文字符串的递归判断: 假设只...