这个代码是关于单链表的建立,插入(尾插、头插,中间任意插入),删除(根据值删除,根据位删除),修改(根据值修改,根据位修改)
查找(根据位置查找,根据值查找)等知识点的综合;
#include<stdio.h>
#include <stdlib.h>
#define T 1
#define F -1
typedef int Type;
typedef int Status;
struct Node
{
Type value;
struct Node* next;
};
Status init(struct Node** head);
Status insert_head(struct Node* head, Type value);
Status insert_tail(struct Node* head, Type value);
Status insert_index(struct Node* head, Type value, int index);
Status delete_index(struct Node* head, int index);
Status delete_value(struct Node* head, Type x);
Status update_index(struct Node* head, int index, Type x);
Status update_value(struct Node* head, Type ov, Type nv);
Status query_index(struct Node* head, int index);
Status query_value(struct Node* head, Type value);
int length(struct Node* head);
void print(struct Node* head);
int main()
{
int ret;
struct Node* head;
ret = init(&head);
if (F == ret)
{
return 1;
}
int i;
for (i = 0; i < 10; i++)
{
insert_head(head, i);
}
for (i = 0; i < 10; i++)
{
insert_tail(head, i);
}
print(head);
length(head);
printf("%d\n", length(head));
delete_index(head, length(head) - 1);
delete_index(head, 0);
delete_index(head, 5);
print(head);
insert_index(head, 99, length(head));
insert_index(head, 99, 0);
insert_index(head, 99, 5);
print(head);
delete_value(head, 4);
print(head);
update_index(head, 4, 0);
print(head);
update_value(head, 0, 4);
print(head);
query_index(head, 6);
query_index(head, 100);
query_value(head, 99);
return 0;
}
Status init(struct Node** head)
{
struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));
if (NULL == newnode)
{
return F;
}
newnode->next = NULL;
newnode->value = 0;
(*head) = newnode;
return T;
}
Status insert_head(struct Node* head, Type 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,Type 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 F;
}
Status insert_index(struct Node* head, Type value, int index)
{
if (index < 0 || index > length(head))
{
printf("out of range\n");
}
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 F;
}
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 0;
}
Status delete_value(struct Node* head, Type x)
{
int i;
int len = length(head);
for (i = 0; i < len; i++) //length(head) 中的head一直在变化 所以需要用一个参数 代替length(head)
{
if (head->next->value == x)
{
struct Node* temp = head->next->next;
free(head->next);
head->next = temp;
}
else
{
head = head->next;
}
}
return F;
}
Status update_index(struct Node* head, int index, Type x)
{
if (index < 0 || index > length(head))
{
printf("out of range\n");
return F;
}
int i;
for (i = 0; i < index; i++)
{
head = head->next;
}
head->value = x;
return T;
}
Status update_value(struct Node* head, Type ov, Type nv)
{
while (head->next != NULL)
{
if (head->next->value == ov)
{
head->next->value = nv;
}
else
{
head = head->next;
}
}
}
Status query_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;
}
printf("第%d个数字是%d\n", index, head->value);
}
Status query_value(struct Node* head, Type value)
{
int i = 0;
while (head->next != NULL)
{
if (head->next->value == value)
{
printf("find = %d\n", i);
}
i++;
head = head->next;
}
}
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");
}
输出结果: