数据结构与算法C程序(2单链表)

数据结构与算法C程序(2单链表)

1、包含的头文件

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

2、重定义类型

typedef int ElemType; //元素类型
typedef int  Status;  //函数返回值类型

3、链表节点结构体

/*链表节点创建*/
typedef struct Node
{
    ElemType data;  //数据
    struct Node *Next;  //指针域
} Node,*LinkList;

4、操作函数

链表创建-头插法

/**
 * @description: 链表创建函数-头插法
 * @param {(LinkList *L)-链表节点头指针,(int n)-链表节点数}
 * @return {无}
 */
void CreateListHead(LinkList *L,int n)
{
    LinkList p;     //链表移动指针
    int i;

    srand(time(0)); //随机数

    *L =(LinkList)malloc(sizeof(Node));  //头节点指针空间开辟
    (*L)->Next = NULL;                   

    for(i=0;i<n;i++)  //节点插入
    {
        p = (LinkList)malloc(sizeof(Node));
        p->data = rand()%100+1;
        p->Next = (*L)->Next;
        (*L)->Next = p;
    }
}

链表创建-尾插法

/**
 * @description:链表创建函数-尾插法 
 * @param {(ListInsert *L)-链表头指针,(int n)-插入节点数}
 * @return {无}
 */
void CreateListLast(LinkList *L,int n)
{
    LinkList p,r;   //插入节点指针和移动指针
    int i;

    srand(time(0));
    *L=(LinkList)malloc(sizeof(Node));  //头指针开辟空间

    r = *L;
    for(i=0;i<n;i++)   //链表创建
    {
        p = (Node *)malloc(sizeof(Node));
        p->data = rand()%100+1;

        r->Next = p;
        r = p;
    }
}

节点插入

/**
 * @description: 链表节点插入函数
 * @param {(LinkList *L)-链表头指针,(int i)-链表插入节点的位数,(int e)-插入的数据}
 * @return {成功返回:1,失败返回:0}
 */
Status ListInsert(LinkList *L,int i,int e)
{
    int j=1;
    LinkList p,s;     //p为移动指针,s为插入节点
    p = *L;
    while(p&&j<i)     //寻找插入点
    {
        p = p->Next;
        j++;
    }
    if(!p||j>i)       //判断插入点是否合理
    {
        return 0;     //不合理返回0
    }
    s = (LinkList)malloc(sizeof(Node));  //插入节点开辟空间
    s->data = e;      //插入节点获取数据

    s->Next = p->Next; //节点指针插入
    p->Next = s;

    return 1;         //插入成功返回0
}

节点删除

/**
 * @description: 链表节点删除
 * @param {(LinkList *L)-链表头指针,(int n)-删除节点的位置}
 * @return {成功返回:1,失败返回:0}
 */
Status ListDelete(LinkList *L,int n)
{
    LinkList p,q;   //移动指针与节点指针
    int j=1;
    p = *L;
    while(p->Next && j<n) //寻找删除点
    {
        p=p->Next;
        ++j;
    }         
    if(!(p->Next)||j>n)
    {
        return 0;       //不合理返回0
    }
    q = p->Next;        
    p->Next = q->Next;
    free(q);

    return 1;
}

链表删除

/**
 * @description: 链表删除
 * @param {(LinkList *L)-链表头指针}
 * @return {无}
 */
void ClearList(LinkList *L)
{
    LinkList p,q;   //移动指针

    p = *L;
    while(p)
    {
        q = p->Next;
        free(p);
        p = q;
    }
}

5、主函数测试

/**
 * @description:主函数 
 * @param {无}
 * @return {无}
 */
void main()
{
    int i,j,n=10;
    Node *p,*s;  //节点头指针和移动指针
    //CreateListHead(&p,10);   
    CreateListLast(&p,10);
    s=p;
    for(i=0;i<=10;i++)
    {
        printf("表中序号%d的数据是%d\n",i,s->data);
        s = s->Next;
    }
    j = ListDelete(&p,10);
    if(j == 1)
    {   
        s=p;
        for(i=0;i<=10;i++)
        {
            printf("表中序号%d的数据是%d\n",i,s->data);
            s = s->Next;
        }
    }
    else
        printf("失败!");
    ClearList(&p);
}

6、测试结果

数据结构与算法C程序(2单链表)

上一篇:循环链表应用——约瑟夫置换


下一篇:数据结构第一次上机题