实验项目:线性表的链表实现:遍历、插入、删除、翻转
实验类型: 基础性
用链表存储线性表,实现线性表的基本操作。
1、 复习C语言的指针的定义、链表的使用;
2、 理解线性表的属性;
3、 实践线性表的链式实现方法以及相关的操作。
4、 要求:提交实验报告,附源程序
涉及的知识点:
1.单链表的基本操作实践。实现单链表的建立(头插、尾插)、销毁、判空、输出、查找、插入、删除等功能,每个功能用一个函数实现。
(1)建立10个元素的链表list:{1,3,2,2,0,4,7,6,5,8},实现单链表的建立的基本操作。
(2)删除链表list:{1,3,2,9,0,4,7,6,5,8}的元素第一个值为2的元素,再在5号位置插入元素2,实现单链表的删除、插入的基本操作。
(3)对(2)步结果的单链表list:{1,3,9,0,2,4,7,6,5,8}的结点进行排序操作,得单链表list:{0,1,2,3,4,5,6,7,8,9}。
2. 基本算法实践。某非空带头结点单链表L中的元素为整数,实现将所有小于零的结点移到所有大于等于零的结点前面。例如L= {1,-3,-2,-9,0,4,7,-6,-5,8},输出新L的结果={-5, -6, -9,-2, -3,1, 0,4,7, 8}
一、建立数组,并将题目中的数据输入,再将数组转化为链表进行后续操作
二、将大于零的结点通过尾结点放到链表的后面,再将小于零的结点通过头结点放到链表的前面
#include
#include
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next; //指向后继结点
} LinkNode; //声明单链表结点类型
//尾插
void CreateList1(LinkNode *&L,ElemType a[],int n)//建立链表,并将数组元素输入
{
LinkNode *S,*R;
L=(LinkNode *)malloc(sizeof(LinkNode));
R=L;
for(int i=0;i<n;i++){
S=(LinkNode *)malloc(sizeof(LinkNode));
S->data=a[i];
R->next=S;
R=S;
}
R->next=NULL;
}
//头插法
void CreateListF(LinkNode *&L,ElemType a[],int n){
LinkNode *s;
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
for(int i=0;i<n;i++){
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=a[i];
s->next=L->next;
L->next=s;
}
}
void DestroyList(LinkNode *&L)//销毁线性表
{
LinkNode *pre=L,*p=L->next;
while(p!=NULL){
free(pre);
pre=p;
p=p->next;
}
free(pre);
}
bool ListEmpty(LinkNode *&L)//判断线性表是否为空
{
return(L->next==NULL);
}
void DispList(LinkNode *L)//输出链表
{
LinkNode *p=L->next;
while(p!=NULL){
printf("%d、",p->data);
p=p->next;
}
printf("\n");
}
int LocateElem(LinkNode *L,ElemType e)//按元素查找
{
int i=1;
LinkNode *p=L->next;
while(p!=NULL&&p->data!=e){
p=p->next;
i++;
}
if(p==NULL)
return (0);
else{
e=p->data;
return (i);
}
}
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;
}
}
bool ListDalete(LinkNode *&L,int i,ElemType &e)//删除数据元素
{
int j=0;
LinkNode *p=L,*q;
if(i<=0)
return false;
while(j<i&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL)
return false;
else{
q=p->next;
if(q==NULL)
return false;
e=q->data;
p->next=q->next;
free(q);
return true;
}
}
void SortList(LinkNode *&L);//声明函数
void Separation(LinkNode *L);//声明函数
int main()
{
LinkNode *L;
printf("实验一:\n");
int a[10]={1,3,2,2,0,4,7,6,5,8};//第一题第一问
CreateList1(L,a,10);
DispList(L);
int b[10]={1,3,2,9,0,4,7,6,5,8},i,e;
CreateList1(L,b,10);//第一题第二问删除第一个元素为二
LocateElem(L,2);
ListDalete(L,i,e);
DispList(L);
ListInsert(L,5,2);
DispList(L);
SortList(L);//第一题第三问
DispList(L);
printf("实验二:\n");
int n;
LinkNode *L2;
printf("请规定单链表的长度:");
scanf("%d",&n);
int c[n];
for(int i=0;i<n;i++){
printf("请输入单链表的第%d个元素:",i+1);
scanf("%d",&c[i]);
}
CreateList1(L,c,n);
Separation(L);
DispList(L);
}
void SortList(LinkNode *&L)//插入排序
{
int t=0;
LinkNode *temp,*p;
for ( temp = L->next->next; temp != NULL; temp = temp->next){
for ( p = L; p->next != NULL; p = p->next){
if (p->next->data > temp->data)//比较大小
{
t = temp->data;
temp->data = p->next->data;
p->next->data = t;
}
}
}
printf("排序之后\n");
}
void Separation(LinkNode *L)
{
LinkNode *p,*q,*i;
p=L->next;
L->next=NULL;
i=L;//i为单链表L的尾结点
while(p!=NULL){
while(i->next!=NULL)
i=i->next;//保证i为尾结点
q=p->next;//q保存p结点后继结点的指针
if(p->data>=0){//比0大或者相等的尾插法
p->next=i->next;
i->next=p;
}
else{//比0小的头插法
p->next=L->next;
L->next=p;
}
p=q;
}
}
欢迎大佬指正