第三天学习数据结构,把链表完成

#include<stdio.h>
#include<malloc.h>
//#include<string.h>
typedef struct List
{
int data;
struct List * pnext;
}sqList;
//动态链表的生成  用单循环链表
void InitList(sqList * list); //初始化链表
void ShowList(sqList list);  //显示链表 
void InsertList(sqList * list );//插入一个数值链表
void DeleteList(sqList * list ); //删除第position元素
bool IsEmpty(sqList * list); //判断是否为空
void Findposition(sqList  list );//查找b在链表中的位置
void showmenu();




int main()
{
int i ;
  sqList *p;//头指针    下面这4行,初始化头指针和头结点
sqList head; //头结点
head.data = 0;
 p = &head;
 head.pnext = &head;  
 showmenu();
for(int j = 0; j<= 10 ;j++)
{
 
 scanf("%d",&i);
switch(i)
{
case 1:
InitList(&head);
break;
case 4:
ShowList(head);
break;
case 2:
InsertList(&head  );
break;
case 3:
DeleteList(&head);
break;
case 5:
IsEmpty(&head);
break;
case 6:
Findposition(head );
break;
}
}
return 0;
}
void showmenu()
{
printf("1创建动态链表\n");
printf("2插入数值进链表\n");
printf("3删除第n个位置元素\n");
printf("4输出链表\n");
printf("5判断链表是否为空\n");
printf("6查找元素在链表的位置\n");
}
void  InitList(sqList * head)
{
int i = 1;
int b = 1;
sqList * tailp;  //创建的尾指针
tailp  = head;
printf("输入0 则退出 输入\n");
while(b != 0)
{

printf("请输入第%d元素\n" , i);
scanf("%d",&b);
sqList * pp;
if(b!=0)
{pp =    ( sqList *) malloc(sizeof(sqList));
tailp->pnext = pp;
pp->data = b;
tailp = pp;
tailp->pnext = head;
i++;
(head->data)++;

}
else
{
}
//头结点的data用来存取个数


}
printf("您输入的链表长度是%d",head->data);


}


void ShowList(sqList list)           //链表必须有个头节点,还应该创建一个指针,使其一次一次后移,输出数据
{
sqList  * pp ;
pp = &list;
 /* while( ((pp->pnext)->data) !=  list.data  )  //比较头结点的存的数值 ,尾节点的next指向head,
{
printf("%d\t",((*pp).pnext)->data);
pp = pp->pnext;   
*/     //错误的方法,因为数据总量,可以和存的值,相同,所以头结点->data 提前等于数据长度,所以不适合
int k = 0;
for(k=1 ; k <= list.data; k++)               
{
printf("%d \t" ,(*pp->pnext).data );
pp = pp->pnext;
}
}


void InsertList(sqList * list  )//插入一个数值链表
{
int b1,position1;
printf("请输入要插入的元素");
scanf("%d",&b1);
printf("请输入要插入的位置");
scanf("%d",&position1);
/* sqList  pt;       //创建一个结构体,用于保存输入的值
pt.data = b1;
sqList * ppt = &pt;   //创建一个指针,指向新创建的结构体
sqList * pp;
pp = list;
int j ;
if(position1 ==1)
{
ppt->pnext = pp->pnext ;
pp->pnext = &pt;    注释这个方法错误,没用动态的创造空间
}
else
{
for( j =1 ; j <position1; j++ )
{
pp = pp->pnext;
}
ppt->pnext = pp->pnext;
pp->pnext = &pt;
}*/


sqList * pt = (sqList *) malloc (sizeof(sqList));
pt->data = b1;
sqList * pp = list;
if(position1 ==1)
{
 pt->pnext = pp->pnext ;
 pp->pnext = pt;
}
else
{
int j ;
for( j =1 ; j <position1; j++ )
{
pp = pp->pnext;
}
pt->pnext = pp->pnext;
pp->pnext = pt;
}
(list->data)++;
}
void DeleteList(sqList * list )
{
int position,i; //positon 是要删除的位置,i 为了循环
printf("请输入要删除的元素的位置\n");
scanf("%d" , &position);
sqList * p = list;  //创建一个移动的指针,为了操作方便
if(position == 1)
{
list->pnext   = list->pnext->pnext;
}
else
{
for( i = 1; i < position ; i++  )  //这个循环不包括删除第一个元素
{
   p = p->pnext;
}
p->pnext = p->pnext->pnext;


}
(list->data)--;
}
bool IsEmpty(sqList *list) //判断是否为空
{
if(list->pnext == list)
{
printf("空表");
return true;
}
else 
{
return false;
}


}


void  Findposition(sqList list )//查找b在链表中的位置
{
int value;
printf("请输入要查找的元素");
scanf("%d" , &value);
sqList  * p ;
p = &list;
int kk ;  //从头开始找
for(kk=1 ; kk <= list.data ; kk++ )
{
p = p->pnext;
if(value == p->data)
{
printf("您要查找的元素在%d位置", kk  );
}
else
{
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值