主要实现的功能
- 登记一个配送数据
- 查询指定配送数据
- 删除一个配送数据
- 显示所有配送数据
- 统计配送数据
- 插入一个配送数据到某位置
- 查询并修改一个数据
初始化
#include "stdio.h"
#include "String.h"
#include "malloc.h"
#define OverFlow -1
#define OK 1
#define Error -1
typedef struct /*定义元素数据类型*/
{ char number[7]; /*序号*/
char id[10]; /*配送编号*/
char name[10];/*姓名*/
char addr[20];/*地址*/
} ElemType;
typedef struct node /*定义链表及结点类型*/
{
ElemType data; /*数据域 */
struct node *next; /*指针域 */
} LNode,*LinkList;
1.登记一个配送数据
尾插法
在最后一个结点后面插入
先分配一个新结点p
P指向最后一个结点,q插到p的后面成为新尾结点
int Insert_Last(LinkList Head, ElemType x) /*在最后一个结点后面插入*/
{
LNode *p,*q;
int k=0;
p=( LinkList)malloc(sizeof(LNode)); /*分配一个结点*/
if (p==NULL)
return OverFlow; /*分配失败*/
p->data=x;
p->next= NULL;
q=Head;
while(q->next!=NULL) /*q指向最后一个元素*/
q=q->next; /*q取后继元素的指针*/
q->next=p; /*设置第i个结点的指针域指向新结点*/
return OK ;
}
2. 查询指定配送数据
根据姓名查找,运用字符串函数strcmp比较
LNode *Location_LinkList(LinkList Head, char *name) /*查找指定关键字信息*/
{
LNode *p;
p=Head->next;
while(p!=NULL) /*未到链尾*/
{ /* 关键字 姓名相等*/
if (strcmp(p->data.name,name) ==0)
return p; /*找到返回指针*/
else
p=p->next; /*p取后继结点的地址*/
}
return NULL; /*未找到,返回空指针*/
}
3. 删除一个配送数据
与查询异曲同工,先找到被删除元素,被删除前面的结点的后继就是被删除结点的后继
int Delete_LinkList(LinkList Head, char *name)
{
LNode *p,*q;
ElemType x;
q=Head; /*q指向头结点*/
p=q->next; /*p取其后继结点的地址*/
while(p!=NULL) /*p不为空 */
{
if (strcmp(p->data.name,name) ==0) /*找到被删除元素*/
{ q->next=p->next; /*q所指结点的指针设置为p所指结点的指针*/
free(p); /*释放p所指结点*/
return OK; /*删除成功*/
}
q=p;
p=p->next; /*q取p的值,p取其后继结点的地址*/
}
return Error ; /*删除失败*/
}
4. 显示所有配送数据
遍历
void Show_LinkList(LinkList Head) /*遍历线性表*/
{
LNode *p;
printf("\n");
p=Head->next; /*p指向第一个结点(非头结点)*/
if (p==NULL)
printf("\n空表! NULL");
while(p!= NULL) /*未结束遍历*/
{ printf(" %s %s %s %s \n",p->data.number, p->data.id,
p->data.name,p->data.addr); /*输出数据*/
p=p->next; /*p取后继结点的地址*/
}
}
5. 统计配送数据
计算线性表的长度
运用sum计数,边遍历边加一
int Length_LinkList(LinkList Head)
{
LNode *p;
int sum=0;
p=Head->next; /*p取头指针的后继*/
while(p!=NULL) /*p与Head不相等*/
{
sum++; /*累加器加1*/
p=p->next; /*p指向其后继结点*/
}
return sum;
}
6. 插入一个配送数据到某位置
同样先建一个新结点,找到要插入的位置的前一个结点,插入其后面
把前面结点的后继给到新结点的后继,原结点后继是新结点
int Insert2(LinkList Head,ElemType x,int k)//第k个
{
LNode *p,*q;
p=(LinkList)malloc(sizeof(LNode));
if(p==NULL)
return OverFlow;
p->data=x;
q=Head;
if(q!=NULL){
for(int i=0;i<k-1;i++)
q=q->next;
p->next=q->next;
q->next=p;
printf("插入成功\n");
return OK;
}
else{
printf("插入失败\n");
return Error;}
}
7. 查询并修改一个数据
通过姓名查找要修改的信息(使用strcmp函数)
然后修改
最后遍历查看
int gai(LinkList Head)//查找并修改数据
{
char name[20];
int b=0,i;
printf("修改的数据信息\n");
printf("数据name\n");
scanf("%s",name);
LNode *p;
p=Head;
while(p!=NULL)
{
if (strcmp(name,p->data.name) ==0)
{
printf("原信息\n");
printf("%s %s %s %s %s \n",p->data.number,p->data.id, p->data.name,
p->data.addr);
printf("请选择要修改的项;\n");
printf("\t \n");/*把每个项的名字输入,这里就不进行仔细叙述了*/
printf("您的选择是\n");
scanf("%d",&i);
printf("请输入修改之后的内容\n");
switch(i)
{
case 1:
char num[50];
//printf("一周播放量排名:\n");
scanf("%s",p->data.number);
break;
case 2:
//printf("粉丝数\n");
scanf("%s",p->data.id);
break;
case 3:
//printf("av号\n");
scanf("%s",p->data.name);
break;
case 4:
//printf("up主\n");
scanf("%s",p->data.addr);
break;
}
printf("修改成功\n");
b=1;
}
p=p->next;
}
return OK;
if(b=0)
{
printf("查无此人\n");
return Error;
}
}