今天写了一下结构体链表,相比顺序链表而言,要相对复杂,但其中没有合并操作,以后在写,这个结构体链表不够成熟,但相对简单的操作还是可行的,下面是代码:
//结构体实现聊表
//提供如下操作 1制空(Making_empty),2判空(Is_empty),4插入(Insert_sag),5查找(Search_sag),6删除(Delete_sag),8退出(exit),7合并(Connect_two_sag)
#include <stdio.h>
#include <stdlib.h>
typedef int data_type;
typedef struct Por
{
data_type data;
struct Por *next;
}sag,*sag_head;
void Making_empty(sag *&);
bool Is_empty(sag *&);
void Insert_sag(sag *&,data_type);
void Search_sag(sag *&,data_type);
void Delete_sag(sag *&,data_type);
//void Connect_two_sag(sag *,sag *,sag *);
int main()
{
sag_head head=NULL;
data_type data;
while(true)
{
printf("选择你的命令:\n \
1-------制空 \n \
2-------插入 \n \
3-------查找 \n \
4-------删除 \n \
5-------合并 \n \
6-------退出 \n");
int trag;
scanf("%d",&trag);
switch(trag)
{
case 1: Making_empty(head);break;
case 2:
printf("print you wanted data: \n");
scanf("%d",&data);
Insert_sag(head,data);break;
case 3:
printf("print your searching data: \n");
scanf("%d",&data);
Search_sag(head,data);break;
case 4:
printf("print your deleting data: \n");
scanf("%d",&data);
Delete_sag(head,data);break;
case 5:
//Connect_two_sag(head1,head2,head);
break;
case 6:
printf("are you really want to exit Y(y) / N(n)\n");
char ch;
getchar();
ch=getchar();
while(ch==' ' && ch!=EOF)
ch=getchar();
switch(ch)
{
case 'Y': case 'y':exit(0);
case 'N': case 'n':printf("\n");break;
} break;
default:
printf("wrong,enter the new operating number\n");
}
}
}
void Making_empty(sag *&p){
sag_head q=p;
while(q!=NULL){
p=p->next;
free(q);
q=p;
}
}
bool Is_empty(sag *&p){
return p==NULL;
}
void Insert_sag(sag *&p,data_type x)
{
sag_head q=(sag_head)malloc(sizeof(*q));
q->data=x;
//printf("%d\n",q->data);
sag_head pre=NULL,cur=p;
for( ; cur!=NULL && cur->data<q->data;pre=cur,cur=cur->next);
if(pre==NULL){
q->next=p;
p=q;
//printf("%d\n",p->data);
return ;
}
pre->next=q;
q->next=cur;
}
void Search_sag(sag *&p,data_type x)
{
//printf("%d\n",);
int i=1;
for(sag_head q=p;q!=NULL;q=q->next,i++)
if(q->data==x){
printf("exists in %d\n",i);
return ;
}
printf("no exists\n");
}
void Delete_sag(sag *&p,data_type x)
{
if(Is_empty(p)){
printf("sag empty! \n");
return ;
}
sag_head pre=NULL,cur=p;
for( ;cur->data!=x && cur!=NULL;pre=cur,cur=cur->next);
if(pre==NULL){
p=p->next;
free(cur);
return ;
}
if(cur==NULL){
printf("%d no exist in sag\n",&x);
return ;
}
pre->next=cur->next;
free(cur);
}