效果如下:
源代码如下:
#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;
}