#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <stdbool.h>
typedef char ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LinkNode;
int InitList(LinkNode *L)
{
L -> next = NULL;
} //初始化链表
int CreateList(LinkNode *L, ElemType a[] , int n)
{
LinkNode *s, *r;
L = (LinkNode *) malloc (sizeof(LinkNode));
r = L;
//r首先指向头结点,在创建链表过程中始终指向尾结点
for(int i = 0; i < n; i++)
{
s = (LinkNode *)malloc(sizeof(LinkNode));
s -> data = a[i];
r -> next = s;
r = s; //r指向插入的前面这些结点的最后一个地址
}
r -> next = NULL;
} //尾插法 ,可省略此函数,直接用ListInsert函数进行插入操作
void DispList(LinkNode *L)
{
LinkNode *p = L -> next;
while(p != NULL)
{
printf("%c ", p -> data);
p = p -> next;
}
printf("\n\n");
} //打印链表
bool ListInsert(LinkNode *L, int i , ElemType e)
{
int j = 0;
LinkNode *p = L, *s;
if(i <= 0)
return false;
while (j < i-1 && p != NULL)
{
j ++;
p = p -> next;
}
if(p == NULL)
return false;
else{
s = (LinkNode *) malloc (sizeof(LinkNode));
s -> data = e;
s -> next = p -> next;
p -> next = s;
return true;
}
}
//在链表第i个位置插入e
int ListLength(LinkNode *L)
{
int n = 0;
LinkNode *p = L ;
while(p->next != NULL)
{
n++;
p = p -> next;
}
printf("此链表的长度为:%d\n\n",n);
} //求单链表的长度
int ListEmpty(LinkNode *L)
{
if(L -> next == NULL)
printf("此单链表为空表\n\n");
else
printf("此单链表不为空表\n\n");
}
//判断此单链表是否为空表
int GetElem(LinkNode *L, int i)
{
LinkNode *p = L;
ElemType e;
for(int j = 0; j < i; j++)
p = p -> next;
e = p -> data;
printf("第%d个元素是:%c\n\n",i , e);
} //打印第i个元素
int LocateElem(LinkNode *L, ElemType e)
{
LinkNode *p = L;
int j = 0;
while(p -> data != e)
{
j++;
p = p -> next;
}
printf("%c的位置是%d\n\n",e,j );
} // 输出某个元素的位置
int ListDelete(LinkNode *L, int i)
{
LinkNode *p = L , *q;
for(int j = 0; j < i - 1; j++)
p = p -> next;
q = p ->next;
p -> next = q -> next;;
free (q);
}
int DestroyList(LinkNode *L)
{
LinkNode *pre = L, *p = L -> next;
while (p != NULL)
{
free(pre);
pre = p;
p = pre -> next;
}
free(pre);
}
int main() {
LinkNode L; //新建一个单链表
InitList(&L); //初始化单链表
printf("依次插入a , b , c , d , e\n");
ListInsert(&L , 1 , 'a');
ListInsert(&L , 2 , 'b');
ListInsert(&L , 3 , 'c');
ListInsert(&L , 4 , 'd');
ListInsert(&L , 5 , 'e');
DispList(&L); //打印单链表
ListLength(&L); //求链表的长度
ListEmpty(&L); //判断此链表是否为空表
GetElem(&L, 3); //输出第i个元素
LocateElem(&L, 'a'); //输出某个元素的位置
ListInsert(&L , 4 , 'f'); //在第i个结点上插入e
DispList(&L);
ListDelete(&L , 3); //删除第i个元素
DispList(&L);
DestroyList(&L);
return 0;
}
李春葆数据结构第二章实验报告
需知道线性表中顺序表和链表的基本规则,此串代码没有进行严格订正,还需加以修改