编辑代码

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;
typedef struct node
{
    ElemType data;
    struct node *next;
}Linklist;
//初始化链表
void InitLinklist(Linklist *L)
{   
    //头指针
    L->next=NULL;
}
//链表的创建,创建n个元素,头插法,随机种子数
void CreateLinklistByHead(Linklist *L,int n)
{
    int i;
    //初始化随机种子函数
    srand(time(0));
    //新节点 p
    Linklist *p;
    for(i=0;i<n;i++)
    {
        p=(Linklist *)malloc(sizeof(Linklist));
        p->data=rand()%100+1;
        p->next=L->next;
        L->next=p;
    }
}
//链表的创建,创建n个元素,尾插法,随机种子数
void CreateLinklistByRear(Linklist *L,int n)
{
    int i;
    //初始化随机种子函数
    srand(time(0));
    //新节点 p
    Linklist *p;
    //更新尾节点
    Linklist *r;
    r=L;
    for(i=0;i<n;i++)
    {
        p=(Linklist *)malloc(sizeof(Linklist));
        p->data=rand()%100+1;
        r->next=p;
        r=p;
    }
    r->next=NULL;
}
//获取第i个位置的元素,*e用来获取的值
Status GetElemValue(Linklist *L,int i,ElemType *e)
{
    int j=1;        //用于控制计数,判断i是否在L里面
    Linklist *p;    //用于读取L第一个节点
    p=L;
    while(p&&j<i)   //查找元素
    {
        p=p->next;
        j++;
    }
    if(!p||j>i)     //链表未找到
        return ERROR;
    *e=p->data;
    return OK;
}
//在链表中第i个位置插入元素
Status InsertLinklistValue(Linklist *L,int i,int value)
{
    Linklist *p,*r;
    //*p 用于读取L第一个节,*r插入的节点
    int j=1;        //用于控制计数,判断i是否在L里面
    p=L;
    r=(Linklist *)malloc(sizeof(Linklist));
    while(p&&j<i)
    {
        p=p->next;
        j++;
    }
    if(!p||j>i)     //链表未找到
        return ERROR;
    r->data=value;
    r->next=p->next;
    p->next=r;
    return OK;
}
//删除链表中第i个位置的元素
Status DeleteLinklistValue(Linklist *L,int i,ElemType *e)
{
    Linklist *p,*r;
    //*p 用于读取L第一个节,*r删除的节点
    int j=1;        //用于控制计数,判断i是否在L里面
    p=L;
    r=(Linklist *)malloc(sizeof(Linklist));
    while(p&&j<i)
    {
        p=p->next;
        j++;
    }
    if(!p||j>i)     //链表未找到
        return ERROR;
    r=p->next;      //删除p后面这个节点
    p->next=r->next; 
    *e=r->data;
    free(r);
    return OK;
}
//打印链表
void PrintLinklist(Linklist *L)
{
    //建立一个节点读取L链表
    Linklist *p;
    p=(Linklist *)malloc(sizeof(Linklist));
    p=L->next;
    while(p!=NULL)
    {
        printf("%d ->",p->data);
        p=p->next;
    }
    printf("\n");
}
int main () {
    int n,num;
    Linklist *L;
    InitLinklist(L);
    scanf("%d",&n);
    CreateLinklistByRear(L,n);
    PrintLinklist(L);
    InsertLinklistValue(L,3,60);
    PrintLinklist(L);
    DeleteLinklistValue(L,2,&num);
    printf("%d\n",num);
    PrintLinklist(L);
    return 0;
}