您的位置:首页 > 理论基础 > 数据结构算法

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

2016-10-20 21:51 218 查看
#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)
<
9a5d
/span>{
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
{
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: