线性表的链式存储结构(C语言实现)

本文介绍了使用头插法和尾插法创建单链表的方法,并提供了完整的C语言实现代码。此外,还详细讲解了如何在单链表中进行插入和删除操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于线性表的顺序存储结构在进行插入与删除是要移动大量的元素,会耗费大量的时间,线性表的链式存储结构就完美的解决了这个问题。
首先是单链表的创建,有头插法和尾插法。

  1. 头插法:
/*  随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) */
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;             /*  随机生成100以内的数字 */
        p->next = (*L)->next;    
        (*L)->next = p;                     /*  插入到表头 */
    }
}

2.尾插法:

/*  随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */
void CreateListTail(LinkList *L, int n) 
{
    LinkList p,r;
    int i;
    srand(time(0));                      /* 初始化随机数种子 */
    *L = (LinkList)malloc(sizeof(Node)); /* L为整个线性表 */
    r=*L;                                /* r为指向尾部的结点 */
    for (i=0; i<n; i++) 
    {
        p = (Node *)malloc(sizeof(Node)); /*  生成新结点 */
        p->data = rand()%100+1;           /*  随机生成100以内的数字 */
        r->next=p;                        /* 将表尾终端结点的指针指向新结点 */
        r = p;                            /* 将当前的新结点定义为表尾终端结点 */
    }
    r->next = NULL;                       /* 表示当前链表结束 */
}

完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct Node{
    int data;
    struct Node *next;
}Node;
typedef struct Node *LinkList;

/*头插法创建单链表*/
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;
    }
}
/*尾插法创建单链表*/
void CreateListTail(LinkList *L, int n){
    LinkList p, r;
    int i;
    srand(time(0));
    *L = (LinkList)malloc(sizeof(Node));
    r = *L;//r为指向尾部的结点
    for (i = 0; i < n; i++){
        p = (LinkList)malloc(sizeof(Node));
        p->data = rand() % 100 + 1;
        r->next = p;
        r = p;      //将p结点赋值给r,使r始终是尾结点
    }
    r->next = NULL;
}

/*单链表的插入*/
void ListInsert(LinkList *L, int i, int e){
    LinkList p,s;
    p = *L;
    int j=1;
    while (p&&j<i)   //寻找第i-1个结点
    {
        p = p->next;
        j++;
    }
    if (!p&&j>i)exit(0);//第i个结点不存在
    s = (LinkList)malloc(sizeof(Node));
    s->data = e;
    s->next = p->next;
    p->next = s;
}
/*单链表的删除*/
void ListDelete(LinkList *L, int i){
    LinkList p, q;
    p = *L;
    int j = 1;
    while (p->next&&j<i)  //寻找第i-1个结点
    {
        p = p->next;
        j++;
    }
    if (!(p->next) && j>i) exit(0);
    q = p->next;
    p->next = q->next;
    free(q);
}
void visit(int c){
    printf("%d ", c);
}
void ListPrint(LinkList L){
    LinkList p = L->next;
    while (p)
    {
        visit(p->data);
        p = p->next;
    }
    printf("\n");
}
int main(){
    LinkList m, n;
    int k = 6;
    CreateListHead(&m,k);
    ListPrint(m);
    CreateListTail(&n, k);
    ListPrint(n);
    ListInsert(&m, 5, 11);
    ListDelete(&n, 3);
    ListPrint(m);
    ListPrint(n);
    system("pause");
    return 0;
}

单链表的插入与删除的关键都是要先找到要操作位置的前一个结点,而插入与删除不同,对于找到第i-1个结点,插入是while (p&&j

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值