C语言 数据结构 实验二 线性表的链式存储及其操作

C语言 数据结构 实验二 线性表的链式存储及其操作

实验项目:线性表的链表实现:遍历、插入、删除、翻转
实验类型: 基础性

【指导思想】

用链表存储线性表,实现线性表的基本操作。

【实验目的及要求】

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;
    }
}

输出结果

C语言 数据结构 实验二 线性表的链式存储及其操作_第1张图片

欢迎大佬指正

你可能感兴趣的:(C语言,数据结构,数据结构,c语言)