线性表是一种基本的数据结构,在计算机编程中具有重要的作用。在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,然后插入四个节点,删除第二个节点,输出链表节点的数据,然后删除头节点,输出剩余的节点数据。
扫码领取最新备考资料