<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>数据结构的一些讲解,供学习者参考,也顺带作为复习 </span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> 链表与顺序表不同,它是一种动态的存储结构,链表中每个结点占用的存储空间不是预先分配的,而是运行时系统根据需求生成的,因此建立单链表从空表开始,每读入一个数据元素则申请一个结点,然后插在链表的头部。下图为链表的构建过程,因为是在链表的头部插入,读入数据的顺序表和线性表的逻辑顺序是相反的。</span>
链表建立
LinkList Creat_LinkList()
{
LNode *s;
int x;
printf("请输入数据(输入'0'表结束输入):\t");
scanf("%d",&x);
while(x!=0)
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=L;
L=s;
printf("请输入数据(输入'0'表结束输入):\t");
scanf("%d",&x);
}
return L;
}
获取某个位置的数据
LNode *Get_LinkList(LinkList L,int i)
{
LNode *p=L;
int j=0;
while(p->next!=NULL&&j<i)
{
p=p->next;
j++;
}
if(j==i)
return p;
else
return NULL;
}
定位到某个元素的结点
LNode *Locate_LinkList(LinkList L,int x)
{
LNode *p=L->next;
while(p!=NULL&&p->data!=x)
p=p->next;
return p;
}
插入算法1,i为插入的位置,x为插入的元素
int Insert_LinkList_1(LinkList L,int i,int x)
{
LNode *p,*s;
p=Get_LinkList(L,i-1);
if(p==NULL)
{
printf("参数i错误\n");
return 0;
}
else
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=p->next;
p->next=s;
return 1;
}
}
插入算法2:表头插入
LinkList Insert_LinkList_2(LinkList L,int x)
{
LNode *s;
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=L;
L=s;
return L;
}
删除链表某个位置的元素
int Del_LinkList(LinkList L,int i)
{
LinkList p,s;
p=Get_LinkList(L,i-1);
if(p==NULL)
{
printf("第i-1个结点不存在\n");
return -1;
}
else if(p->next==NULL)
{
printf("第i个结点不存在\n");
return 0;
}
else
{
s=p->next;
p->next=s->next;
free(s);
return 1;
}
}
计算链表的长度
int Length_LinkList(LinkList L)
{
LNode *p=L;
int j=0;
while(p)
{
p=p->next;
j++;
}
return j;
}
输出链表内的所有元素
void OutputList(LinkList L)
{
LNode *p=L;
while(p)
{
printf("%4d",p->data);
p=p->next;
}
}
主函数设计
void main()
{
LinkList H=NULL;
int item,model,addr;
while(1)
{
printf("请选择操作:\n【1】创建链表\n【2】特定位置插入数据\n【3】表头插入数据\n【4】特定元素删除\n【5】表长度\n【6】查看链表\n【7】退出\n");
printf("请输入:\t");
scanf("%d",&model);
fflush(stdin);
switch(model)
{
case 1:
H = Creat_LinkList();
OutputList(H);
break;
case 2:
while(1)
{
printf("请输入插入的位置\t");
scanf("%d",&addr);
if(addr==0)
break;
printf("请输入插入的数据\t");
scanf("%d",&item);
Insert_LinkList_1(H,addr,item);
}
OutputList(H);
break;
case 3:
while(1)
{
printf("请输入插入的数据\t");
scanf("%d",&item);
if(item==0)
break;
H=Insert_LinkList_2(H,item);
}
OutputList(H);
break;
case 4:
while(1)
{
printf("请插入删除的位置\t");
scanf("%d",&addr);
if(addr==0)
break;
Del_LinkList(H,addr);
}
OutputList(H);
break;
case 5:
printf("%d\n",Length_LinkList(H));
break;
case 6:
OutputList(H);
printf("\n");
break;
case 7:
exit(0);
default:
printf("输入有误,请重新输入\n");
}
}
}
需要源代码的欢迎下载,免积分,共同学习,家下来每天都会分享一篇,持续一个星期
http://download.youkuaiyun.com/detail/kevin_iot/9395889