数据结构|课设-链表

主要实现的功能

  1. 登记一个配送数据
  2. 查询指定配送数据
  3. 删除一个配送数据
  4. 显示所有配送数据
  5. 统计配送数据
  6. 插入一个配送数据到某位置
  7. 查询并修改一个数据

初始化

#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;
		}
	}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值