笔记
作业
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字节