希赛考试网
首页 > 软考 > 信息系统管理工程师

如何C语言创建一个线性表

希赛网 2023-11-14 08:22:46

线性表是一种基本的数据结构,在计算机编程中具有重要的作用。在C语言中,可以通过定义结构体来创建线性表。如何C语言创建一个线性表呢?本文将从以下几个角度进行分析:

第一步:定义结构体

在C语言中,定义结构体是创建数据类型的一种方式。通过定义结构体来表示一个线性表节点的数据结构。以下是一个示例代码:

```

typedef struct Node {

int data;

struct Node *next;

}Node, *List;

```

上述代码定义了一个节点结构体类型Node,其中包含数据域data和指向下一个节点的指针next。另外,定义了两个别名Node和List,其中Node表示节点类型,List表示链表类型。

第二步:创建节点

在C语言中,可以通过动态内存分配函数malloc来创建节点。以下是一个示例代码:

```

Node *createNode(int data) {

Node *node = (Node *)malloc(sizeof(Node));

node->data = data;

node->next = NULL;

return node;

}

```

上述代码定义了一个createNode函数,用于创建一个节点。该函数接收一个参数data,即节点的数据。通过malloc函数动态分配内存,分配大小为节点结构体类型Node的大小,然后将data赋值给节点的数据域,将next指针设置为NULL,最后返回该节点。

第三步:插入节点

在该线性表中,插入节点分为头插法和尾插法两种。以下是两种方法的示例代码:

(1)头插法

```

void insertFirst(List *list, int data) {

Node *node = createNode(data);

node->next = *list;

*list = node;

}

```

上述代码定义了一个insertFirst函数,用于在链表的头部插入节点。该函数接收两个参数,一个是指向链表头部指针的指针,另一个是要插入的节点的数据。以插入的节点为参数调用createNode函数,返回一个节点,然后将该节点的next指针指向原链表的头部指针,最后将list指针指向新节点。

(2)尾插法

```

void insertLast(List *list, int data) {

Node *node = createNode(data);

if (*list == NULL) {

*list = node;

}

else {

Node *lastNode = *list;

while (lastNode->next != NULL) {

lastNode = lastNode->next;

}

lastNode->next = node;

}

}

```

上述代码定义了一个insertLast函数,用于在链表的尾部插入节点。该函数接收两个参数,一个是指向链表头部指针的指针,另一个是要插入的节点的数据。首先判断链表是否为空,如果为空,则将list指针指向新节点,否则,遍历到链表的末尾,将最后一个节点的next指针指向新节点。

第四步:删除节点

在该线性表中,删除节点有两种方式,一种是删除头节点,一种是删除指定位置的节点。以下是示例代码:

(1)删除头节点

```

void deleteFirst(List *list) {

if (*list == NULL) {

return;

}

Node *temp = *list;

*list = temp->next;

free(temp);

}

```

上述代码定义了一个deleteFirst函数,用于删除链表中的头节点。该函数接收一个指向链表头部指针的指针。首先判断链表是否为空,如果为空,则直接返回;否则,将list指针指向原链表的下一个节点,然后释放原来头节点的内存。

(2)删除指定位置的节点

```

void deleteNode(List *list, int position) {

if (*list == NULL) {

return;

}

Node *temp = *list;

if (position == 1) {

*list = temp->next;

free(temp);

}

else {

for (int i = 1; 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;

}

}

```

上述代码定义了一个deleteNode函数,用于删除链表中指定位置的节点。该函数接收两个参数,一个是指向链表头部指针的指针,另一个是要删除的节点的位置。首先判断链表是否为空,如果为空,则直接返回。如果要删除的是头节点,则将list指针指向原链表的下一个节点,释放原来头节点的内存。否则,遍历到指定位置的前一个节点,将后面的节点地址赋给一个临时变量nextNode,释放当前节点的内存,然后将前面的节点next指针指向nextNode。

第五步:测试代码

创建好线性表之后,需要进行测试。以下是一个示例代码:

```

int main() {

List list = NULL;

insertLast(&list, 10);

insertLast(&list, 20);

insertFirst(&list, 5);

insertLast(&list, 30);

deleteNode(&list, 2);

Node *temp = list;

while (temp != NULL) {

printf("%d ", temp->data);

temp = temp->next;

}

printf("\n");

deleteFirst(&list);

temp = list;

while (temp != NULL) {

printf("%d ", temp->data);

temp = temp->next;

}

printf("\n");

return 0;

}

```

上述代码创建了一个空链表list,然后插入四个节点,删除第二个节点,输出链表节点的数据,然后删除头节点,输出剩余的节点数据。

扫码领取最新备考资料


软考.png


信息系统管理工程师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
信息系统管理工程师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考资格查询系统

扫一扫,自助查询报考条件