数据结构之单链表实验

单链表实验

  • 实验目的
    • 实验环境
      • 实验要求
        • 实验内容
          • 源代码
            • 运行结果

实验目的

  1. 掌握线性表的定义、特点、逻辑结构,理解线性表的抽象数据类型。
  2. 熟练掌握线性表的两种存储结构的结构类型定义、特点和基本操作的实现。
  3. 通过本次实验帮助学生加深对线性表的理解,并加以应用;

实验环境

CodeBlocks

实验要求

1.熟悉c语言的语法知识;
2.了解线性表的逻辑结构特性;
3.掌握线性表的链式存储结构—单链表的定义、创建、插入、删除、取值等基本操作;

实验内容

完成单链表的基本操作(定义、初始化、插入、删除、定位等)的汇总,用一个完整的程序实现单链表的基本运算。要求在主函数中对以上操作进行调用,实现以下功能:
(1)定义单链表link1,用尾插入法创建link1,并输出创建后的link1元素序列。
(2)计算link1的长度,并将结果存放在头结点的数据域中,然后输出单链表的所有元素(包含头结点,头结点作为第一个输出)。
(3)定义单链表link2,产生10个1-200的随机整数,通过插入函数依次保存到带头结点的Link2中,并输出插入后的link2元素序列。
(4)查找link1中第i个元素(i由用户输入),输出第i个元素的值。
(5)由用户输入一个数,然后通过查找函数查找这个数是否在link1中,如果在则删除这个数并输出删除后的link1,如果不在则输出找不到。
(6)调用删除函数删除link2中第i个元素(i由用户输入),删除成功后输出删除后的link2的元素序列,删除失败则显示不存在这个数。

*备注:产生随机数的方法srand((int)time(0)),rand();(随机函数所在头文件,时间函数所在头文件)

源代码
#include
#include
#include

typedef int elemtype;
typedef struct node
{
    elemtype data;
    struct node *next;
}LinkList;

LinkList * Init_LinkList()
{
    LinkList *head;
    head = (LinkList *) malloc (sizeof( LinkList ));
    head->next = NULL;
    return(head);
}

LinkList * Create_LinkListR()   /*尾插法建立单链表*/
{
    elemtype ix;
    LinkList * head, * p, * tail;
    head = (LinkList *) malloc (sizeof( LinkList ));
    if (head == NULL)
        return head;
    head->next=NULL;
    tail = head;
    printf("请输入数据直到输入0结束:\n");
    scanf("%d", &ix);
    while(ix != 0)
    {
        p = (LinkList *) malloc (sizeof( LinkList ));
        if(p == NULL)
            return head;
        p->data=ix;
        tail->next=p;
        tail = p;
        tail->next=NULL;
        scanf("%d", &ix);
    }
    return head;
}

int Print_LinkList(LinkList *head) /*遍历单链表*/
{
    LinkList * p=head;
    if(p == NULL)
        return 0;
    while(p!= NULL)
    {
      printf("\t%d", p->data);
      p=p->next;
    }
    return 1;
}

int  LinkList_Length(LinkList *head) /*求单链表长度*/
{
    LinkList * p=head;
    int j=0;
    while(p->next!=NULL)
    {
        p=p->next;
        j++;
    }
    return j;
}

LinkList * GetData_LinkList(LinkList *head, int i) /*按序号查找*/
{
    LinkList * p;
    int j=0;
    if (i<=0)return NULL;
    p=head;
    while(p->next!=NULL && j<i)
    {
        p=p->next;
        j++;
    }
    if(i == j)return p;
    else return NULL;
}

LinkList * Search_LinkList(LinkList *head, elemtype key) /*按值查找*/
{
    LinkList * p;
    p=head->next;
    while(p!=NULL)
        if (p->data!=key)
        p=p->next;
    else
        break;
    return p;
}

void InsertAfter_LinkList(LinkList *p, LinkList *s) /*后插运算*/
{
    s->next=p->next;
    p->next=s;
}

int DeleteAfter_LinkList(LinkList *p) /*删除后继结点*/
{
    LinkList *r;
    if(! p)return 0;
    r=p->next;
    if(! r)
    {
        return 0;
    }
    p->next=r->next;
    free(r);
    return 1;
}

int DeleteNode_LinkList (LinkList *head, LinkList *p) /*删除指点结点*/
{
    LinkList *r;
    if (p->next!=NULL)
    {
        p->data=p->next->data;
        return(DeleteAfter_LinkList(p));
    }
    else
    {
        r=head;
        while(r->next!=p)
            r=r->next;
        return(DeleteAfter_LinkList(r));
    }


}

LinkList * HeadData_LinkList(LinkList *p,int q)
{
    p->data=q;
    return p;
}

int DeleteNo_LinkList(LinkList *head,int i)
{
    LinkList *p,*r;
    if(i<=0)p=NULL;
    else if(i==1)p=head;
    else p=GetData_LinkList(head,i - 1);
    if(p==NULL)
    {
        return 0;
    }
    else
    {
        r=p->next;
        if(r==NULL)return 0;
        p->next=r->next;
        free(r);
        return 1;
    }
}

void main() /*主函数*/
{
    LinkList *link1,*link2;
    LinkList *p,*q,*s,*r;
    int k,n,i,j,l;
    int a[10];

    link1=Init_LinkList();
    link2=Init_LinkList();
    printf("创建单链表link1");
    link1=Create_LinkListR();
    q=link1->next;
    printf("\n单链表link1的数据元素为:");
    k=Print_LinkList(q);

    n=LinkList_Length(link1);
    printf("\n单链表link1的长度为:%d\n",n);
    printf("\nlink1中的所有结果为:\n");
    Print_LinkList(HeadData_LinkList(link1,n));

    srand((unsigned)time(0));
    j=0;
    while(j<10)
    {
        a[j]=rand()%201;
        j++;
    }
    for(i=0;i<10;i++)
    {
        printf("\na[%d]=%d",i,a[i]);
    }
    l=0;
    do
    {
        s=(LinkList *) malloc (sizeof(LinkList));
        s->data=a[l];
        InsertAfter_LinkList(link2,s);
        l++;
    }
    while(l<10);

    printf("\n单链表link2的数据元素有");
    q=link2->next;
    k=Print_LinkList(q);

    printf("\n输入要查找link1中的元素序号:\n");
    scanf("%d",&k);
    p=GetData_LinkList(link1,k);
    if(p!=NULL)
    {
        printf("\n单链表中第%d个元素的值为:%d\n",k,p->data);
    }
    else
    {
        l=DeleteNode_LinkList(link1,r);
        if(l==1)
        {
            printf("\n删除数据元素%d后的单链表link1中的数据元素有:\n",k);
            Print_LinkList(link1->next);
        }
        else
            printf("\n删除失败");
    }

    printf("\n输入要在单链表link2中删除的数据元素值的位置:\n");
    scanf("%d",&k);
    l=DeleteNo_LinkList(link2,k);
    if(l==1)
    {
        printf("\n删除数据元素%d后的单链表link2中的数据元素有:\n",k);
        Print_LinkList(link2->next);
    }
    else
    {
        printf("单链表link2中不存在值为%d的数据元素,删除失败\n",k);
    }
}

运行结果

数据结构之单链表实验_第1张图片

//小声bb:内容整理不易,各位客官老爷点个赞再走吧~

你可能感兴趣的:(学习记录,数据结构,链表,c语言)