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

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

  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

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,实现线性表链式存储结构可以使用指针来实现链式存储结构是通过节点之间的指针连接来表示线性表中的元素关系。 首先,我们需要定义一个节点结构体,该结构体包含两个成员:数据域和指针域。数据域用于存储节点中的数据,指针域用于指向下一个节点。 ```c // 定义节点结构体 typedef struct Node { int data; // 数据域 struct Node* next; // 指针域,指向下一个节点 } Node; ``` 接下来,我们可以定义一个链表结构体,该结构体包含一个指向头节点的指针。 ```c // 定义链表结构体 typedef struct LinkedList { Node* head; // 头节点指针 } LinkedList; ``` 然后,我们可以实现一些基本的操作函数来对链表进行操作,例如插入、删除、查找等。 1. 插入操作:在链表中插入一个新节点,可以在头部插入或者在指定位置插入。 ```c // 在头部插入新节点 void insertAtHead(LinkedList* list, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = list->head; list->head = newNode; } // 在指定位置插入新节点 void insertAtPosition(LinkedList* list, int data, int position) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; if (position == 0) { newNode->next = list->head; list->head = newNode; } else { Node* current = list->head; for (int i = 0; i < position - 1 && current != NULL; i++) { current = current->next; } if (current != NULL) { newNode->next = current->next; current->next = newNode; } } } ``` 2. 删除操作:从链表中删除指定位置的节点。 ```c // 删除指定位置的节点 void deleteAtPosition(LinkedList* list, int position) { if (list->head == NULL) { return; } Node* temp = list->head; if (position == 0) { list->head = temp->next; free(temp); return; } for (int i = 0; temp != NULL && i < position - 1; i++) { temp = temp->next; } if (temp == NULL || temp->next == NULL) { return; } Node* nextNode = temp->next->next; free(temp->next); temp->next = nextNode; } ``` 3. 查找操作:在链表中查找指定值的节点。 ```c // 查找指定值的节点 Node* search(LinkedList* list, int value) { Node* current = list->head; while (current != NULL) { if (current->data == value) { return current; } current = current->next; } return NULL; } ``` 这样,我们就可以使用上述定义的结构体和函数来实现线性表链式存储结构了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值