数据结构——链表操作(电话管理系统 )

时间:2021-07-30 08:58:22

效果如下:


数据结构——链表操作(电话管理系统 )


源代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ERROR 0
#define OK 1
#define N 3
#define M 100
typedef struct node
{    
char data1[20];    
char data2[12];    
struct node *next;
} Lnode, *linklist;
int creatlist_L(linklist &L);
int Listinsert_L(linklist &L, int i, char *a, char *b);
int listDelete_L(linklist &L, int i );
void clear_list(linklist &L);
int outlist_L(linklist L);
void main()
{   
int a, i = 0, x, h = 0, k = 0; 
char A[20], B[12];  
linklist L;
L = (linklist) malloc(sizeof(Lnode)); 
L->next = NULL;   
while (1)
{

      printf(".............................................\n");
      printf("        电话管理系统              \n\n");
 printf("         输入1表示建表操作\n"); 


 printf("         输入2表示插入操作\n"); 
 printf("         输入3表示删除操作\n");  
      printf("         输入4表示操作完毕打印整个链表\n"); 
 printf("         输入5表示清空操作\n");
 printf("         输入0表示退出\n");
 printf(".............................................\n");
printf("请从序号0--6中选择:\n");
for(i = 0; i < M; i++)
{      
printf("请输入你的操作选项:");   
scanf("%d", &a);    
if(a == 0) 
{


printf("谢谢您的使用,再见!\n");
return;
}

else if(a==1)
{
  x=creatlist_L(L);
  printf("本次操作您一共输入了%d组数据",x);
}

else if(a==2) 
{
printf("请输入你想插入的位置: ");      
scanf("%d", &x);       
printf("请输入姓名:\n");       
scanf("%s", A);           
printf("请输入电话号:\n");           
scanf("%s", B);           
h = Listinsert_L(L, x, A, B);         
if(h)  
printf("%d位置插入成功\n", x);     
 
}
else if(a==3) 
{
printf("请输入你想删除的位置");        
            scanf("%d", &x);            
k = listDelete_L(L, x );      
if(k) 
printf("%d位置删除成功\n", x);   
}
else if(a==4)
{
printf("这是您要求的信息显示:\n");
x=outlist_L(L);
printf("一共包含信息%d条\n",x);
}
       else if(a == 5)
{
            clear_list(L);
printf("顺序表已清空!您可以继续其他操作!\n");
}
   else if(a!=0||a!=1||a!=2||a!=3||a!=4||a!=5) 
{
printf("你输入的不正确,请重新输入\n");    
  
}   
 
}
}
}
int creatlist_L(linklist &L)//顺序输入
{
     
int i,m;
linklist p,r;
 
L = (linklist) malloc(sizeof(Lnode));
r=L;
L->next=NULL;
printf("下面创建学生信息查询系统,请按提示输入数据:\n");
     printf("您一共要输入多少组学生数据?\n");
scanf("%d",&m);
     for(i=1;i<=m;i++) 
{
p = (linklist) malloc(sizeof(Lnode));
printf("请输入姓名\n");   
scanf("%s", p->data1);     
printf("请输入电话号\n");      
scanf("%s", p->data2); 
r->next=p;
    r=p;
}
r->next=NULL;
return m;
}


int Listinsert_L(linklist &L, int i, char *a, char *b)
{    //带头节点的链表中地i个位置插入。    
linklist p = L, s;    
int j = 0, y = 0, x = 0;    
while(p && j < i - 1)
{        //寻找第i个节点。        
p = p->next;        
++j;     
}    
if(!p || j > i - 1)//i小于1或大于表长加1.     
{        
printf("输入的结点不合法\n");            return ERROR;    
}    
s = (linklist)malloc( sizeof (Lnode));//生成新的节点。    
strcpy(s->data1, a);    
strcpy(s->data2, b);        
s->next = p-> next;    
p->next = s;    
return OK;
}
int listDelete_L(linklist &L, int i )



 linklist p = L, q; 
   int j = 0; 
   while(p->next && j < i - 1)
   {    
  p = p->next;     
  ++j;   
 }  
   if(!(p->next) || j > i -1)
   {     
  printf("输入的节点不合法\n");    
  return ERROR;  
  }   
   q = p->next;   
   p->next = q->next;
   free(q);   
   return OK;
}
void clear_list(linklist &L)
{
struct node *p;
if(!L)
{
printf("分配存储失败\n");
}
else
{
while(L->next!=NULL)
{
p=L->next;
L->next=p->next;
}
free(L);
printf("链表已清空\n");
}
}
int outlist_L(linklist L)
{   int m=0;
   Lnode *q;
    q=L->next;
while(q)
{  
printf("电话:%s\n",q->data1);
printf("姓名:%s\n",q->data2);
q=q->next;
m++;      
     }  

return m;
}