#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int DataType;
typedef struct Node
{
DataType data; // 数据域
struct Node * next; // 指针域
}LinkList;
LinkList * Creat_List(int a[], int n); // 创建链表
bool Empty_List(LinkList * L); // 判空
int Length_List(LinkList * L); // 链表长度
void Traverse_List(LinkList * L); // 遍历
int Locate_List(LinkList * L, DataType x); // 按值查找
bool Get_List(LinkList * L, int pos, DataType * x); // 按位查找
bool Insert_List(LinkList * L, int pos, DataType x); // 插入
bool Delete_List(LinkList * L, int pos, DataType *x);// 删除
bool Destroy_List(LinkList * L); // 销毁链表
int main()
{
DataType x,val;
int a[5] = {12, 24, 33, 56, 78};
LinkList * L = Creat_List(a,5);
printf("链表元素:");
Traverse_List(L);
if(Insert_List(L, 2, 45))
{
printf("\n插入成功!\n");
printf("插入元素:45");
printf("\n插入位置:第2个结点\n");
}
else
printf("\n插入失败!\n");
printf("链表元素:");
Traverse_List(L);
if(Delete_List(L, 2, &val))
{
printf("\n删除成功!\n");
printf("删除元素:%d\n",val);
printf("删除位置:第2个结点\n");
}
else
printf("\n删除失败!\n");
printf("链表元素:");
Traverse_List(L);
printf("\n按值查找的元素:33");
printf("\n按值查找元素的位置序号:%d\n\n",Locate_List(L,33));
if(Get_List(L, 4, &x))
{
printf("按位查找成功!\n");
printf("按位查找的元素:%d\n",x);
printf("按位查找的位置:第4个结点\n");
}
else
printf("查找失败!\n");
printf("\n链表长度:%d\n",Length_List(L));
printf("\n链表元素:");
Traverse_List(L);
return 0;
}
LinkList * Creat_List(int a[], int n)
{
int i;
LinkList * L = (LinkList*)malloc(sizeof(LinkList));// 创建一个头结点,返回头结点的地址
if(!L)
{
printf("申请空间失败!\n");
exit(-1);
}
LinkList * Tail = L; // 创建一个尾指针,指向头结点
Tail->next = NULL;
for(i = 0; i<n; ++i)
{
printf("第%d个结点的值:",i+1);
printf("%d",a[i]);
LinkList * p = (LinkList*)malloc(sizeof(LinkList));
p->data = a[i];
Tail->next = p;
p->next = NULL;
Tail = p;
printf("\n");
}
printf("单链表创建成功!\n");
return L;
}
bool Empty_List(LinkList * L)
{
if(L->next==NULL) // 头结点指针域为空,为空表
return true;
else
return false;
}
int Length_List(LinkList * L)
{
int cnt = 0;
LinkList * p = L->next;
while(p!=NULL)
{
cnt++;
p = p->next;
}
return cnt;
}
void Traverse_List(LinkList * L)
{
LinkList * p = L->next;
while(p!=NULL)
{
printf("%3d",p->data);
p = p->next;
}
printf("\n");
return;
}
int Locate_List(LinkList * L, DataType x)
{
int pos = 1;
LinkList * p = L->next;
while(p->data!=x&&p!=NULL)
{
pos++;
p = p->next;
}
if(p!=NULL)
return pos;
else
return 0;
}
bool Get_List(LinkList * L, int pos, DataType * x)
{
int i = 1;
LinkList * p = L->next;
if(pos<1||pos>Length_List(L))
return false;
while(i<pos&&p!=NULL)
{
i++;
p = p->next;
}
if(p!=NULL)
{
*x = p->data;
return true;
}
else
return false;
}
bool Insert_List(LinkList * L, int pos, DataType x)
{
int i = 1;
LinkList * p = L->next;
if(pos<1||pos>Length_List(L))
return false;
while(i<pos-1&&p!=NULL)
{
i++;
p = p->next;
}
if(p!=NULL)
{
LinkList * q = (LinkList *)malloc(sizeof(LinkList));
if(!q)
{
printf("申请空间失败!\n");
exit(-1);
}
q->data = x;
q->next = p->next;
p->next = q;
return true;
}
else
return false;
}
bool Delete_List(LinkList * L, int pos, DataType * x)
{
int i = 1;
LinkList * p = L->next;
if(Empty_List(L))
return false;
if(pos<1||pos>Length_List(L))
return false;
while(i<pos-1&&p!=NULL)
{
i++;
p = p->next;
}
if(p!=NULL)
{
LinkList * q = p->next;
*x = q->data;
p->next = q->next;
free(q);
return true;
}
else
return false;
}
bool Destroy_List(LinkList * L)
{
LinkList * p = L;
if(Empty_List(L))
return false;
while(p!=NULL)
{
p = p->next;
free(L);
L = p;
}
L = p = NULL; // 防止产生野指针
return true;
}
单链表(C语言实现)
猜你喜欢
转载自blog.csdn.net/Mr_Morgans/article/details/120981791
今日推荐
周排行