数据结构实验题:线性表的基本操作在顺序存储结构和链接存储结构上的运算,以及对相应算法的性能分析。

给定一段程序代码,程序代码所完成的功能为:(1)建立一个线性表;(2)依次输入数据元素1,2,3,4,5,6,7,8,9,10;(3)删除数据元素5;(4)依次显示当前线性表中的数据元素。假设该线性表的数据元素个数在最坏情况下不会超过100个,要求使用单链表。

删除元素的函数要用到二级指针,如果对二级指针不熟悉,可以不使用remove_elem函数,在主函数中把remove_elem注释起来,然后将main函数中的代码的注释去掉即可,效果是一样的。


程序如下所示:

#include <stdio.h>
#include <stdlib.h>

typedef int DataType;

struct LinkList
{
    DataType elem;
    struct LinkList *next;
};

//根据数据的内容创建链表,然后返回链表的首元素指针
struct LinkList *CreateList(DataType arr[],int len)
{
    int i = 0;

    struct LinkList *ptr = NULL;
    struct LinkList *pHead = NULL;

    //初始化第一个结点
    pHead = (struct LinkList*)calloc(1,sizeof(struct LinkList));
    ptr = pHead;
    ptr->elem = arr[0];

    for( i = 1 ; i < len ; i++ )
    {
        ptr->next = (struct LinkList*)calloc(1,sizeof(struct LinkList));
        ptr = ptr->next;
        ptr->elem = arr[i];
    }
    return pHead;
}

//删除元素e
void remove_elem(struct LinkList **pList,DataType e)
{
    struct LinkList *p1 = *pList;
    struct LinkList *p2 = NULL;

    //如果删除的是第一个结点
    if((*pList)->elem == e)
    {
        *pList = (*pList)->next;
        free(p1);
        return ;//删除了第一个节点,下一个节点为头结点
    }

    //只要删除的不是第一个,都是修改前驱链域
    p2 = p1->next;
    while(p2)
    {
        if(p2->elem == e)
        {
            p1->next = p2->next;
            free(p2);
            return ;
        }
        p1 = p2;//p1是前驱
        p2 = p2->next;//p2是后继
    }
}

//输出数据
void print_elem(struct LinkList *pList)
{
    while(pList)
    {
        printf("%d ",pList->elem);
        pList = pList->next;
    }
    putchar('\n');
}

//释放资源
void free_list(struct LinkList *pList)
{
   struct LinkList *p = pList->next;

   while(pList)
   {
       free (pList);
       pList = p;
       p = p->next;
   }
}

int main(int argc, char* argv[])
{
    struct LinkList *pList = NULL;
    struct LinkList *p1 = NULL;
    struct LinkList *p2 = NULL;
    DataType arr[]={1,2,3,4,5,6,7,8,9,10};

    //创建链表
    pList = CreateList(arr,10);

    //删除元素
    remove_elem(&pList,5);
/*
    p1 = pList;
    //如果删除的是头结点
    if(pList->elem == 5)
    {
        pList = pList->next;
        free(p1);
    }
    //删除的不是头结点
    p2 = pList->next;
    while(p2)
    {
        if(p2->elem == 5)
        {
            p1->next = p2->next;
            free (p2);
            break;
        }
        p1 = p2;
        p2 = p2->next;
    }

 */
    //输出表的数据
    print_elem(pList);

    return 0;
}

运行结果:


有什么不懂得欢迎提问。

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答