数据链表


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


#define T 1
#define F -1


typedef int Status;
typedef int ElementType;


struct Node
{
ElementType value;
struct Node* next;
};


Status init(struct Node** head);
Status insert_head(struct Node* head, ElementType value);
Status insert_tail(struct Node* head, ElementType value);
Status insert_index(struct Node*head, ElementType value, int index);
Status delete_index(struct Node* head, int index);
Status delete_value(struct Node* head, ElementType value);
Status update_index(struct Node*head, int index, ElementType value);
void update_value(struct Node*head, ElementType old_value, ElementType new_value);
void query_value(struct Node* head, ElementType value);
Status query_index(struct Node* head, int index);
int length(struct Node* head);
void print(struct Node* head);


int main()
{
int i;
int ret = 0;
    
struct Node* head = NULL;
ret = init(&head);
if (F == ret)
{
return 1;
}


    for (i = 0; i < 10; i++)
{
insert_head(head, i);
}
    for (i = 0; i < 10; i++)
{
insert_tail(head, i);
}


print(head);


printf("length = %d\n", length(head));


delete_index(head, length(head) - 1);
delete_index(head, 0);
delete_index(head, 5);
print(head);


insert_index(head, 99, 5);
insert_index(head, 99, 0);
insert_index(head, 99, length(head));
print(head);


delete_value(head, 0);
print(head);


update_index(head, 4, -1);
print(head);

update_value(head, 99, 100);
print(head);

query_value(head, 100);
query_value(head, 99);


query_index(head, 10);


return 0;
}


Status init(struct Node** head)
{
struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));
if (NULL == newnode)
{
return F;
}
newnode->value = 0;
newnode->next = NULL;
    (*head) = newnode;

return T;
}




Status insert_head(struct Node* head, ElementType value)
{
struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));
if (NULL == newnode)
{
return F;
}
    
newnode->value = value;
    newnode->next = head->next;
head->next = newnode;


return T;
}


Status insert_tail(struct Node* head, ElementType value)
{
struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));
if (NULL == newnode)
{
return F;
}
    
newnode->value = value;
newnode->next = NULL;


while (head->next != NULL)
{
head = head->next;
}


head->next = newnode;
return T;
}


Status insert_index(struct Node*head, ElementType value, int index)
{
if (index < 0 || index > length(head))
{
printf("out of range\n");
return F;
}


int i;
for (i = 0; i < index; i++)
{
head = head->next;
}


struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));
if (NULL == newnode)
{
return F;
}


newnode->value = value;
newnode->next = head->next;
head->next = newnode;


return T;
}


Status delete_index(struct Node* head, int index)
{
if (index < 0 || index >= length(head))
{
printf("out of range\n");
return F;
}
int i;
for (i = 0; i < index; i++)
{
head = head->next;
}


struct Node* temp = head->next->next;
free(head->next);
head->next = temp;
return T;
}


Status delete_value(struct Node* head, ElementType value)
{
    int len = length(head);
int i;
for (i = 0; i < len; i++)
{
printf("i = %d value = %d\n", i, head->next->value);
if (head->next->value == value)
{
struct Node* temp = head->next->next;
free(head->next);
head->next = temp;
}
else
{
head = head->next;

}
}
return T;
}


Status update_index(struct Node*head, int index, ElementType value)
{
if (index < 0 || index >= length(head))
{
printf("out of rangr\n");
return F;
}
int i;
for (i = 0; i <= index; i++)
{
head = head->next;
}
head->value = value;
return T;
}




void update_value(struct Node*head, ElementType old_value, ElementType new_value)
{
int i;
while (head->next != NULL)
{
if (head->next->value == old_value)
{
head->next->value = new_value;
}
head = head->next;
}
}


void query_value(struct Node* head, ElementType value)
{
int count = 0;
int index = 0;
while (head->next != NULL)
{
if (head->next->value == value)
{
count++;
printf("find %d : %d\n", value, index);
}
head = head->next;
index++;
}
if (0 == count)
{
printf("not found %d\n", value);
}
}


Status query_index(struct Node* head, int index)
{
if (index < 0 || index >= length(head))
{
printf("out of rangr\n");
return F;
}
int i;
for (i = 0; i <= index; i++)
{
head = head->next;
}


printf("index = %d value =%d\n", index, head->value);
return T;
}


int length(struct Node* head)
{
int count = 0;
while (head->next != NULL)
{
count++;
head = head->next;
}
return count;
}


void print(struct Node* head)
{
while (head->next != NULL)
{
printf("%d ", head->next->value);
head = head->next;
}
printf("\n");
}
在C语言中实现数据链表,主要涉及到结构体的定义以及指针的操作。链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。以下是创建和操作链表的基本步骤: 1. 定义节点结构体:首先,我们需要定义一个结构体来表示链表的节点,它至少包含数据域和指向下一个节点的指针域。 ```c typedef struct Node { int data; // 数据域,存储节点数据 struct Node* next; // 指针域,指向下一个节点的指针 } Node; ``` 2. 创建链表节点:我们可以编写一个函数来创建一个新的节点。这个函数通常会接受一个数据值,创建一个节点,并初始化指针域为NULL。 ```c Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); if (newNode != NULL) { newNode->data = data; newNode->next = NULL; } return newNode; } ``` 3. 插入节点:插入节点有多种情况,比如在链表头部插入、尾部插入或者在特定节点之后插入。以在链表尾部插入为例,我们需要遍历到链表的末尾,然后将新节点添加到链表的末尾。 ```c void insertAtEnd(Node** head, int data) { Node* newNode = createNode(data); if (*head == NULL) { *head = newNode; } else { Node* current = *head; while (current->next != NULL) { current = current->next; } current->next = newNode; } } ``` 4. 遍历链表:遍历链表用于访问链表中的每个节点。我们从头节点开始,通过不断访问每个节点的next指针,直到遍历完所有节点。 ```c void traverseList(Node* head) { Node* current = head; while (current != NULL) { printf("%d ", current->data); current = current->next; } printf("\n"); } ``` 5. 删除节点:删除链表中的节点也需要考虑多种情况,比如删除头节点、尾节点或者中间的某个节点。以删除头节点为例: ```c void deleteHead(Node** head) { if (*head != NULL) { Node* temp = *head; *head = (*head)->next; free(temp); } } ``` 6. 释放链表:最后,当不再需要链表时,我们应该遍历链表并释放每个节点所占用的内存。 ```c void freeList(Node** head) { Node* temp; while (*head != NULL) { temp = *head; *head = (*head)->next; free(temp); } } ``` 通过以上步骤,我们就可以在C语言中实现基本的链表操作。实际应用中,链表可能会根据需要变得更加复杂,例如包含多个数据域、使用双向链表或者循环链表等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值