嵌入式学习

笔记

作业 

        1. 创建单链表、创建新结点、头插、尾插、单链判空、链表输出、头删、尾删、按位置插入、按位置删除。

        LinkList.h文件

#ifndef __LINK_LIST__
#define __LINK_LIST__

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct LNode {
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;

//创建单链表,即创建头结点
LinkList create_link_list();
//创建新结点
LNode* create_lnode(ElemType data);
//头插法新建链表,这里前提是已经创建好头结点
void link_head_insert(LinkList L,ElemType data);
//尾插法新建链表
void link_tail_insert(LinkList L,ElemType data);
//单链表判空
int isEmpty_link(LinkList L);
//链表输出
void print_link(LinkList L);
//头删
void link_head_delete(LinkList L);
//尾删
void link_tail_delete(LinkList L);

//单链表在第pos个位置插入元素data
void link_insert_loc(LinkList L,int pos,ElemType data);
//单链表在第pos个位置删除
void link_delete_loc(LinkList L,int pos);




#endif

        LinkList.c文件

#include "LinkList.h"

//创建单链表,实际上是创建头结点
LinkList create_link_list()
{
	LinkList L=(LinkList)malloc(sizeof(LNode));
	if(NULL==L)
	{
		printf("空间申请失败\n");
		return NULL;
	}
	L->data=0;//这里用头结点的数据域来记录链表的长度
	L->next=NULL;
	return L;
}

//创建结点,创建数据结点
LNode* create_lnode(ElemType data)
{
	LNode *new=(LNode*)malloc(sizeof(LNode));
	if(NULL==new)
	{
		printf("空间申请失败\n");
		return NULL;
	}
	new->data=data;
	return new;
}

//头插
void link_head_insert(LinkList L,ElemType data)
{
	/*
	//如果一开始没有链表时,需要申请
	L=(LinkList)malloc(sizeof(LNode));
	if(NULL==L)
	{
		printf("申请空间失败\n");
		return;
	}
	L->next=NULL;
	*/
	/*
	//申请新的结点
	LNode *s=(LNode*)malloc(sizeof(LNode));
	if(NULL==s)
	{
		printf("新结点空间申请失败\n");
		return;
	}
	*/
	if(NULL==L)
	{
		printf("链表不存在\n");
		return;
	}
	//调用创建新结点的函数创建新结点
	LNode *s=create_lnode(data);
	//s->data=data;
	s->next=L->next;
	L->next=s;
	L->data++;
	return;
}



//单链表判空
int isEmpty_link(LinkList L)
{
	if(NULL==L)
	{
		printf("链表不存在\n");
		return -1;
	}
	return L->next==NULL?1:0;
}

//链表输出
void print_link(LinkList L)
{
	if(NULL==L)
	{
		printf("链表不存在\n");
		return;
	}
	if(isEmpty_link(L))
	{
		printf("链表为空\n");
		return;
	}
	LinkList p=L->next;
	while(p!=NULL)
	{
		printf("%3d",p->data);
		p=p->next;
	}
	return;
}

//头删
void link_head_delete(LinkList L)
{
	if(NULL==L)
	{
		printf("链表不存在\n");
		return;
	}
	if(isEmpty_link(L))
	{
		printf("链表为空\n");
		return;
	}
	LinkList p=L->next;
	ElemType e=p->data;
	L->next=L->next->next;
	free(p);
	L->data--;
	return;
}

//单链表尾插
void link_tail_insert(LinkList L,ElemType data)
{
	if(NULL==L)
	{
		printf("链表不存在\n");
		return;
	}
	LinkList rear=L;
	while(rear->next!=NULL)
	{
		rear=rear->next;
	}
	//调用创建结点的函数创建新结点
	LNode *s=create_lnode(data);
	rear->next=s;
	rear=s;
	rear=NULL;
	L->data++;
	return;
}

//尾删
void link_tail_delete(LinkList L)
{
	if(NULL==L)
	{
		printf("链表不存在\n");
		return;
	}
	if(isEmpty_link(L))
	{
		printf("链表为空\n");
		return;
	}
	LinkList p=L,rear=L->next;
	while(rear->next!=NULL)
	{
		p=rear;
		rear=rear->next;
	}
	//ElemType e=p->data;//如果需要获取被删除元素的值
	rear=p;
	p=p->next;
	free(p);
	rear->next=NULL;
	L->data--;
	return;
}

//单链表在第pos个位置插入
void link_insert_loc(LinkList L,int pos,ElemType data)
{
	if(NULL==L)
	{
		printf("链表不存在\n");
		return;
	}
	if(pos<1 || pos>L->data+1)
	{
		printf("输入位置不合法\n");
		return;
	}
	LinkList p=L;
	int count=0;
	while(count!=pos-1)//找到要插入位置的前驱
	{
		p=p->next;
		count++;
	}
	//调用创建新结点的函数创建新结点
	LNode *s=create_lnode(data);
	s->next=p->next;
	p->next=s;
	L->data++;
}

//单链表在第pos个位置删除
void link_delete_loc(LinkList L,int pos)
{
	if(NULL==L)
	{
		printf("链表不存在\n");
		return;
	}
	if(isEmpty_link(L))
	{
		printf("链表为空\n");
		return;
	}
	if(pos<1 || pos>L->data)
	{
		printf("删除位置不合理\n");
		return;
	}
	int count=0;
	LinkList p=L;
	while(count!=pos-1)//找到要插入位置的前驱
	{
		p=p->next;
		count++;
	}
	//ElemType e=p->data;//如果需要获取被删除元素的值
	LinkList s=p->next;
	p->next=p->next->next;
	free(s);
	L->data--;
	return;
}

        main.c文件

#include "LinkList.h"

int main()
{
	LinkList L=create_link_list();//新建链表,即新建头结点
	printf("头插法插入5个元素:\n");
	link_head_insert(L,1);//头插
	link_head_insert(L,2);
	link_head_insert(L,3);
	link_head_insert(L,4);
	link_head_insert(L,5);
	print_link(L);
	putchar(10);
	printf("头删:\n");
	link_head_delete(L);//头删
	print_link(L);
	putchar(10);
	printf("尾插,插入元素6:\n");
	link_tail_insert(L,6);//尾插
	print_link(L);
	putchar(10);
	printf("尾删:\n");
	link_tail_delete(L);//尾删
	print_link(L);
	putchar(10);
	printf("按位置插入,在第2个位置插入元素5:\n");
	link_insert_loc(L,2,5);//按位插入
	print_link(L);
	putchar(10);
	printf("按位置删除,删除第2个位置元素\n");
	link_delete_loc(L,2);//按位删除
	print_link(L);
	putchar(10);
	return 0;
}

        2. 求以下结构体的大小。

#pragma pack(2)    //指定两字节对齐
typedef struct
{
    char x;
    struct A
    {
        short a;
        int *b;
        char c;    
    }p;
    long b;
}T;
#pragma pack()

        2+(2+8+2)+8=22字节

  • 21
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值