一、要求
编写一个程序linklist.cpp (或.c),实现单链表的各种基本运算和整体建表算法(假设顺序表的内容类型ElemType为char),并在此基础上设计一个程序exp3.cpp (或.c) 完成一下功能。
(1) 初始化一个单链表L。
(2) 采用尾插法依次将元素a、b、c、d、e插入单链L中。
(3) 输出单链表L。
(4) 输出单链表L的长度。
(5) 判断单链表L是否为空。
(6) 输出单链表L的第3个长度。
(7) 输出元素a的位置。
(8) 在单链表L的第4个元素位置上插入元素f。
(9) 输出单链表L。
(10) 删除单链表L的第3个元素。
(11) 输出单链表L。
(12) 销毁单链表L。
二、代码实现:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define OK 1
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define ERROR 0
typedef char ElemType;
typedef int Status;
typedef struct LNode {
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//初始化单链表
Status InitList(LinkList &L) //初始化线性表
{
L = (LinkList )malloc(sizeof(LNode)); //创建头结点
if (!L) {
exit(OVERFLOW);
}
L->next = NULL;
return OK;
}
//输出单链表
void DispList(LinkList &L)
{
LinkList p;
p = L->next;
while (p != NULL)
{
printf("%c ", p->data);
p = p->next;
}
printf("\n");
}
//输出单链表长度
int lengthList(LinkList &L)
{
int n = 0;
LinkList p = L->next;
while (p != NULL)
{
n++;
p = p->next;
}
return n;
}
//判断单链表是否为空
int emptyList(LinkList &L)
{
if (L->next== NULL)
return TRUE;
else
return FALSE;
}
//查值
Status GetElem(LinkList &L, int i, ElemType &e)
{
int j=1;
LinkList p = L->next; //struct LNode *p = L->next;
while (p&&(j < i))
{
p = p->next;
++j;
}
if (!p || j > i)
return ERROR;
e = p->data;
return OK;
}
//查元素位置
int LocateElem(LinkList L, ElemType e)
{
int i = 1;
LinkList p = L->next; //p指向开始节点,i置为1(即开始节点的序号为1)
while (p != NULL && p->data != e) //查找data值为e的节点,其序号为i
{
p = p->next;
i++;
}
if (p == NULL) //不存在元素值为e的节点,返回0
return(0);
else //存在元素值为e的节点,返回其逻辑序号i
return(i);
}
//插入
Status ListInsert(LinkList &L, int i, ElemType e)
{
int j = 0;
LinkList p = L,s;
while (p&&(j<i-1))
{
p = p->next;
++j;
}
if (p == NULL)
return ERROR;
else
{
s=(LinkList )malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
}
//删除链表中的元素
Status ListDelete(LinkList &L, int i)
{
int j = 0;
LinkList p = L,q;
while ((p->next) && (j < i - 1))
{
p = p->next;
++j;
}
if (!(p->next) || (j > i - 1))
return ERROR;
q = p->next;
p->next = q->next;
delete q;
return OK;
}
//销毁单链表
Status DestroyList(LinkList &L)
{
LinkList q = L;
while (q != NULL)
{
LinkList p = q;
q = q->next;
free(p);
p = NULL;
}
return OK;
}
//exp3.cpp
# include<stdio.h>
int main()
{
int m;
ElemType e;
LinkList(L);
printf("1:初始化链表L\n");
InitList(L);
printf("2:将a,b,c,d,e插入到单链表L里\n");
ListInsert(L, 1, 'a');
ListInsert(L, 2, 'b');
ListInsert(L, 3, 'c');
ListInsert(L, 4, 'd');
ListInsert(L, 5, 'e');
printf("3:输出单链表L:");
DispList(L);
m = lengthList(L);
printf("4:输出单链表L的长度:%d\n",m);
printf("5:单链表L为: %s \n", (emptyList(L) ? "空" : "非空"));
GetElem(L, 3, e);
printf("6:单链表L第3个元素:%c\n",e);
printf("7:单链表L中a元素的位置:%d\n", LocateElem(L,'a'));
printf("8:在单链表L第4个元素位置插入f\n");
ListInsert(L, 4, 'f');
printf("9:插入f后的单链表L为:");
DispList(L);
printf("10:删除单链表L的第3个元素\n");
ListDelete(L, 3);
printf("11:删除第3个元素后的单链表L为:");
DispList(L);
printf("12:销毁单链表L\n");
DestroyList(L);
while (1);
return 0;
}
三、运行结果