链表是一种常用的数据结构,对于链表主要有两种实现实现方法,分别是指针和数组,指针实现则不需要连续的存储空间,元素分布在不同的地址,通过指针找到,而数组实现的话,就需要分配一段连续的存储空间,而且对于元素也有数量限制。
1、指针实现,即链式结构
虽然数组实现比价麻烦,但是有时使用数组的效率可能更高一点,而且一些程序语言没有指针,于是就得通过数组实现指针
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int value;
struct Node *next;
};
typedef struct Node Node;
/************************
插入函数,通过使用二级指针,
达到修改头指针的目的
************************/
void Insert(Node **head,int value)
{
Node **current = head,*newnode;
while(*current != NULL && (*current)->value < value)
current = &(*current)->next; //指向下一个地址的指针
newnode = (Node *)malloc(sizeof(Node));
while(newnode == NULL)
newnode = (Node *)malloc(sizeof(Node));
newnode->value = value;
newnode->next = *current;
*current = newnode;
}
/****
查找某一元素,并返回指向这个元素的指针
***/
Node **Find(Node **head,int value)
{
Node **current = head;
while(*current != NULL && (*current)->value != value)
current = &(*current)->next;
return current;
}
void Delete(Node **head,int value)
{
Node **position,*temp;
position = Find(head,value);
if(*position == NULL)
{
printf("No Element!\n");
return ;
}
temp = *position;
*position = (*position)->next;
free(temp);
}
void Output(Node *head)
{
Node *current = head;
while(current != NULL)
{
printf("%d ",current->value);
current = current->next;
}
printf("\n");
}
void Free(Node *head)
{
Node *temp,*current;
current = head;
while(current != NULL)
{
temp = current;
current = current->next;
free(temp);
}
}
/*
测试程序
*/
int main(void)
{
int temp;
Node *head = NULL;
printf("Please input the element you want to input:");
scanf("%d",&temp);
while(temp != 0)
{
Insert(&head,temp);
scanf("%d",&temp);
}
Output(head);
printf("Please input the element you want to find:");
scanf("%d",&temp);
printf("The element:%d\n",(*Find(&head,temp))->value);
printf("Please input the element you want to delete:");
scanf("%d",&temp);
Delete(&1head,temp);
printf("After delete:");
Output(head);
Free(head);
return 0;
}
代码中使用了二级指针,当然也可以不使用,如果没有使用的话,就需要在插入和删除时返回头指针,避免在插入和删除时修改头指针,同时我们也可以在创建链表的同时,创建一个头节点,我们称之为哑节点,并不保存元素,只指向下一个节点。在某些情况下,使用哑节点可使得某些操作变得简单。
2、数组实现
#include<stdio.h>
#include<stdlib.h>
#define Size 100
struct Node
{
int value;
int next;
};
typedef struct Node Node;
Node Array[Size]; //全局变量
/*
初始化整个数组,使前一个元素指向后一个元素,
最后一个元素的next为0;
表示结尾。
*/
void Initialize(void)
{
int i;
for(i = 0;i < Size-1;i++)
Array[i].next = i + 1;
Array[Size - 1].next = 0;
}
/*
模拟malloc操作
第一个元素始终指向第一个空的位置
*//
int Malloc(void)
{
int newnode;
newnode = Array[0].next;
Array[0].next = Array[newnode].next;
Array[newnode].next = 0;
return newnode;
}
/*
模拟free操作
将数组的第一个元素指向即将要删除的元素
*/
void Free(int position)
{
Array[position].next = Array[0].next;
Array[0].next = position;
}
void Insert(int head,int value)
{
int newnode,prev,current;
prev = head;
current = Array[head].next;
while(current != 0 && Array[current].value <value)
{
prev = current;
current = Array[current].next;
}
newnode = Malloc();
if(newnode != 0)
{
Array[newnode].value = value;
Array[newnode].next = current;
Array[prev].next = newnode;
}
}
int Find(int head,int value)
{
int temp = Array[head].next;
while(temp != 0 && Array[temp].value != value)
temp = Array[temp].next;
return temp;
}
int Findprev(int head,int value)
{
int temp = head,current = Array[head].next;
while(current != 0 && Array[current].value != value)
{
temp = current;
current = Array[current].next;
}
return temp;
}
void Delete(int head,int value)
{
int temp,prev;
prev = Findprev(head,value);
if(prev != 0)
{
temp = Array[prev].next;
Array[prev].next = Array[temp].next;
Free(temp);
}
else
printf("No Find!\n");
}
void Output(int head)
{
int current = Array[head].next;
while(current != 0)
{
printf("%d ",Array[current].value);
current = Array[current].next;
}
printf("\n");
}
/*
测试程序
*/
int main(void)
{
int temp,head;
Initialize();
head = Malloc();
printf("Please input the element you want to input:");
scanf("%d",&temp);
while(temp != 0)
{
Insert(head,temp);
scanf("%d",&temp);
}
Output(head);
printf("Please input the element you want to find:");
scanf("%d", &temp);
temp = Find(head,temp);
if(temp)
printf("The position of element: %d\n",temp);
else
printf("No Find!\n");
printf("Please input the element you want to delete:");
scanf("%d",&temp);
Delete(head,temp);
Output(head);
return 0;
}
虽然数组实现比价麻烦,但是有时使用数组的效率可能更高一点,而且一些程序语言没有指针,于是就得通过数组实现指针