链表的实现

这星期学了《大话数据结构》中的链表。

链表就跟排队一样,中途会有人插队,也会有人等不及离开。

如果用数组来实现这个队列的话,在人离开,与加入,都需要将目标位置的后面所有对象前移,或后移。这时间上会造成很多浪费。

如果用链表的话,只需找到目标对象,插入与删除对象时,只要改变指针的指向就可以了。在寻找对象的时候虽然会比数组多消耗时间,但是在进行插入和删除操作时,可以节省时间。

 

 

代码如下:

#include 
#include 
#include 
//定义节点类型
typedef int status;
typedef int ElemType;
typedef struct Node
{
    ElemType data;                //定义数据域
    struct Node*next;        //定义指针域
} Node,*LinkList;

//链表初始化,首先要建立一个空表,即头指针指向NULL的表
//头插法
/*void InitList(LinkList*L,int number)
{
    int count;
    LinkList p;
    srand(time(0));
    *L=(LinkList)malloc(sizeof(Node));  //申请节点
    if(L==NULL)
    {
        printf("申请对象失败\n");    //申请失败
    }
    (*L)->next=NULL;                      //将头指针指向NULL
    for(count=0; countdata=rand()%100+1;
        p->next=(*L)->next;
        (*L)->next=p;
    }
}*/

//尾插法
void InitList(LinkList*L,int number)
{
    int count;
    LinkList p,sNode;
    srand(time(0));
    *L=(LinkList)malloc(sizeof(Node));
    if(L==NULL)
    {
        printf("申请对象失败\n");
    }
    sNode=*L;
    for(count=0; countdata=rand()%100+1;
        sNode->next=p;
        sNode=p;
    }
    sNode->next=NULL;
}

status ListInsert(LinkList*L,int number,ElemType e)  //在线性表L中第number个位置插入新元素e
{
    LinkList p,sNode;
    int find=1;
    p=*L;
    while(p&&findnext;
        find++;
    }
    if(!number||find>number)                         //没有找到元素
        return 0;
    sNode=(LinkList)malloc(sizeof(Node));   //为节点开辟空间
    sNode->data=e;                          //将值存入data中
    sNode->next=p->next;                      //使指针p也指向s的后驱
    p->next=sNode;                            //使指针从指向s的后驱改为指向p
    return 1;
}

//删除第i个元素
status ListDelete(LinkList*L,int number,ElemType*e)//删除线性表L中第i个位置元素,并用e返回其值
{
    LinkList p,sNode;
    int find=1;
    p=*L;
    while(p->next&&findnext;
        find++;
    }
    if(!(p->next)||find>number)                         //没有找到元素
        return 0;
    sNode=p->next;
    p->next=sNode->next;                    //将指针指向p改为指向p的后驱
    *e=sNode->data;                         //将值存入data中
    free(sNode);                            //free释放内存p
    return 1;
}

void ExpurgateList(LinkList*L)       //整表删除
{
    LinkList p,sNode;
    p=*L;
    sNode=p->next;
    while(sNode)
    {
        p->next=sNode->next;
        free(sNode);
        sNode=p->next;
    }
    (*L)->next=NULL;
}

void PrintLinkList(LinkList*L)
{
    LinkList p;
    p=(*L)->next;
    while(p)
    {
        printf("%d\n",p->data);
        p=p->next;
    }
}

int main()
{
    LinkList L;
    int count,choose,value,number;
    printf("请输入数字n,创建含有n个随机数字的链表\n");
    scanf("%d",&count);
    printf("链表的元素如下\n");
    InitList(&L,count);
    PrintLinkList(&L);
    while(1)
    {
        printf("********************************\n");
        printf("*插入元素请输入1               *\n");
        printf("*删除元素请输入2               *\n");
        printf("*整表删除请输入3               *\n");
        printf("*退出程序请输入其他任意数字    *\n");
        printf("********************************\n");
        scanf("%d",&choose);
        switch(choose)
        {
        case 1:
            printf("请输入插入元素的值和位置\n");
            scanf("%d%d",&value,&number);
            ListInsert(&L,number,value);
            printf("链表元素如下\n");
            PrintLinkList(&L);
            break;
        case 2:
            printf("请输入删除元素的位置\n");
            scanf("%d",&number);
            ListDelete(&L,number,&value);
            printf("链表元素如下\n");
            PrintLinkList(&L);
            break;
        case 3:
            ExpurgateList(&L);
            PrintLinkList(&L);
            break;
        default:
            return 0;
        }
    }
}

 

你可能感兴趣的:(链表的实现)