数据结构——链表
链表的存储结构
单链表中,我们在C语言可用结构指针来描述。
/*线性表的单链表存储结构*/
typedef struct node
{
DataType data;
struct node *next;
}Node;
链表的初始化
首先定一个链表头指针
Node *list;
初始化函数,创建一个头结点,并把头指针指向头结点,头结点的data中保存链表的长度。
int Init(Node **p)
{
*p = (Node *)malloc(sizeof(Node));
if(NULL == *p)
{
return 0;
}
(*p)->next = NULL;
(*p)->data = 0;
return 1;
}
在主函数中调用
if(Init(&list))
{
printf("init success!\n");
}
else
{
printf("init failure!\n");
}
链表指定位置插入元素
参数:list(头指针),n(插入的位置),e(要插入的内容)
int Insert(Node *list, int n, DataType e)
{
Node *p = list;
int i;
if(NULL == list || n <= 0 || n > list->data + 1)
{
printf("Insert %d failure!\n", e);
return 0;
}
Node *tmp = (Node *)malloc(sizeof(Node));
tmp->data = e;
for(i = 1; i < n; i++)
{
p = p->next;
}
if(p->next == NULL)
{
p->next = tmp;
tmp->next = NULL;
}
else
{
tmp->next = p->next;
p->next = tmp;
}
list->data++;
return 1;
}
在主函数中调用,在1,2,3位置分别插入1,2,3
for(i = 0; i < 3; i++)
{
if(Insert(list, i + 1, i + 1))
{
printf("insert %d success!\n", i + 1);
}
else
{
printf("insert %d failure!\n", i + 1);
}
}
打印链表内容
参数:list(头指针)
void Print(Node *list)
{
Node *p = list;
if(NULL == list || NULL == list->next)
{
printf("the list is empty!\n");
return;
}
for (p = p->next; p != NULL; p = p->next)
{
printf("%d ", p->data);
}
printf("\n");
}
主函数中调用
Print(list);
获取指定位置元素
参数:list(头指针),n(位置),e(接收元素的值)
int Get(Node *list, int n, DataType *e)
{
int i;
Node *p = list;
if(n <= 0 || n > list->data)
{
return 0;
}
for(i = 0; i < n; i++)
{
p = p->next;
}
*e = p->data;
return 1;
}
在主函数中调用
i = 3;
if(Get(list, i, &e))
{
printf("the %dth elem is %d\n", i, e);
}
else
{
printf("get %dth elem failure\n", i);
}
删除指定位置元素
参数:list(头指针),n(位置),e(被删除的元素)
int Delete(Node *list, int n, DataType *e)
{
int i;
Node *p = list;
if(NULL == list || n <= 0 || n > list->data)
{
return 0;
}
for(i = 1; i < n; i++)
{
p = p->next;
}
*e = p->next->data;
p->next = p->next->next;
list->data--;
return 1;
}
主函数中调用
i = 3;
if(Delete(list, i, &e))
{
printf("delete %dth elem %d success!\n", i, e);
}
else
{
printf("delete %dth elem failure!\n", i);
}
销毁链表
参数:list(头指针的地址)
int Destory(Node **list)
{
Node *p = *list;
Node *q;
while(p)
{
q = p->next;
free(p);
p = q;
}
*list = NULL;
return 1;
}
主函数中调用
if(Destory(&list))
{
printf("destory list success!\n");
}
else
{
printf("destory list failure!\n");
}