因为数据结构考试的大题是这两个,所以抽一点时间实现了一下:
运行的环境是这样的
//创建一个节点
struct Node
{
int a; //数据域
struct Node *next; //指针域,指向数据的节点
};
//全局定义头尾指针方便调用
struct Node *head = NULL;
struct Node *end = NULL;
//创建一个链表,初始化的工作
void AddListTill(int a)
{
struct Node *temp = (struct Node *)malloc(sizeof(struct Node)); //进行强制类型转换
// 创建一个节点
temp->a = a;
temp->next = NULL;
// 连接分为两种情况,一种是没有节点,一种是有节点,将东西加到节点上面
if (NULL == head)
{
head = temp;
}
else
{
end->next = temp;
// 尾节点应该指向最后一个
}
end = temp; //尾节点应该始终指向最后一个节点
}
//函数的功能是尾添加的方式在尾节点添加的方式增加一个节点,输入的参数就是这个节点的数据。首先创建一个节点,并且申请一个节点的内存
//,之后对传入节点的数据进行赋值,尾添加的节点应该是指向NULL。此时就是也该判断了,要考虑节点的存在问题
//遍历链表----查的操作
void ScanList()
{
struct Node *temp = head; //定义一个临时变量来指向头
while (temp != NULL)
{
printf("%d\n", temp->a);
temp = temp->next; //temp指向限一个地址,实现了++的操作
}
// 函数的作用是遍历这个链表,首先定义一个用于遍历的指针变量(是临时的),用while循环遍历输出
}
struct Node *FindNode(int a)
{
struct Node *temp = head;
while (temp != NULL)
{
if (a == temp->a)
{
return (temp);
}
temp = temp->next;
}
// 没找到
return (NULL);
}
// 找到就返回节点,找不到就返回NULL
//链表清空----不就是全部删除
void FreeList()
{
// 一个一个的NULL
struct Node *temp = head; //定义一个临时变量来指向头
while (temp != NULL)
{
struct Node *pt = temp;
temp = temp->next; //temp指向下一个地址
free(pt); //释放当前
}
// 头尾清空,不然下次的头会出现别的情况
head = NULL;
end = NULL;
}
//使用遍历的做法来逐个的释放对应的节点,,在最后应该将头尾节点变NULL,否则下次的链表会接着这次的链表的头尾
//指定的位置插入节点----在指定位置增加
void AddListRand(int index, int a)
{
if (NULL == head)
{
printf("链表没有节点\n");
return;
}
struct Node *pt = FindNode(index);
if (NULL == pt)
{
printf("没有指定的节点\n");
return;
}
// 有此节点。创建临时的节点,申请对应可以使用的内粗空间
struct Node *temp = (struct Node *)malloc(sizeof(struct Node));
// 节点成员间进行赋值
temp->a = a;
temp->next = NULL;
// 连接到链表上1.找到节点在尾部,2.找到节点在中间
if (pt == end)
{
// 尾巴的下一个加上我们的要指向的下一个要插入的节点
end->next = temp;
// 新的尾巴
end->next = temp;
}
else
{
// 先连后面(先将要插入的接待你指针指向原来找到节点的下一个
temp->next = pt->next;
// 后连前面
pt->next = temp;
}
}
// 难点在于找要插入的节点位置,在这样的基础上去判断要插入的指针节点要怎么办。
// 尾部删除----删除的操作
void DeleteListTail()
{
if (NULL == end)
{
printf("链表为空,无需删除\n");
return;
}
// 链表不为空
// 链表里面有一个节点
if (head == end)
{
free(head);
head = NULL;
end = NULL;
}
else
{
// 找到尾巴的一个节点
struct Node *temp = head;
while (temp->next != end)
{
temp = temp->next;
}
// 找到了,删除尾巴
// 释放尾巴
free(end);
// 尾巴的迁移
end = temp;
// 尾巴指针为NULL
end->next = NULL;
}
}
// 尾删除的过程和前面的做法一样,都是先去判断相关的系欸但的问题。只有一个节点的时候,直接置尾NULL
// 不为空的时候,要使用遍历但是是从后去遍历的,倒数第二个先找到,然后将最后的一个节点的内存释放了
// 再将第二个节点设置尾end然后将它的指针指向null
// 删除头的操作
void DeleteListHead()
{
// 记住旧头
struct Node *temp = head;
// 链表监测
if (NULL == head)
{
printf("链表为空\n");
return;
}
head = head->next; //头的第二个节点变成新的头
free(temp);
}
// 先定义一个临时变量指向旧的头,将头的第二个记为新的头指针head,然后将旧的头释放
// 删除一个指定的节点
void DeleteListRand(int a)
{
// 链表判断,是不是没有什么东西
if (NULL == head)
{
printf("链表没有东西\n");
return;
}
// 链表有东西,找这个节点
struct Node *temp = FindNode(a);
if (NULL == temp)
{
printf("查无此节点\n");
return;
}
// 找到了,且只有一个节点
if (head == end)
{
free(head);
head = NULL;
end = NULL;
}
else if (head->next == end)
{
if (end == temp)
{
DeleteListTail();
}
else if (temp == head)
{
DeleteListHead();
}
else
// 多个节点
{
//看是删除头还是尾
if (end == temp)
{
DeleteListTail();
}
else if (temp == head)
{
DeleteListHead();
}
else //删除中间某一个节点
{
// 找要删除temp的前一个,遍历
struct Node *pt = head;
while (pt->next != temp)
{
pt->next = temp->next;
free(temp);
}
}
}
}
}
int main()
{
// printf("Hello, World!\n");
struct Node *pFind;
// 创建5个节点
for (int i = 0; i < 6; i++)
AddListTill(i);
DeleteListRand(4);
ScanList();
FreeList();
// return 0;
}
链表
//顺序表的实现
typedef struct Table{
int *head;//声明一个名叫head的长度不确定的数组,动态数组
int length;//记录当前顺序表的长度
int size;//记录顺序表分配的存储容量
}table;
//此处为初始化
table initTable(){
table t;
t.head = (int*)malloc(Size*sizeof(int));
if(!t.head){
printf("初始化失败!");
exit(0);
}
t.length=0;
t.size = Size;
return (t);
}
table addTable(table t,int elem,int add){
if(add>t.length+1||add<1){
printf("插入的位置有问题\n");
return (t);
}
if(t.length>=t.size){
t.head=(int*)realloc(t.head,(t.size+1)*sizeof(int));
if(!t.head){
printf("存储分配失败\n");
}
t.size+=1;
}
for(int i=t.length-1;i>=add-1;i--){
t.head[i+1]=t.head[i];
}
t.head[add-1]=elem;
t.length++;
return (t);
}
table delTable(table t,int add){
if(add>t.length||add<1){
printf("被删除元素的位置有误\n");
return (t);
}
for(int i=add;i<t.length;i++){
t.head[i-1]=t.head[i];
}
t.length--;
return (t);
}
table selectTable(table t,int elem){
for(int i=0;i<t.length;i++){
if(t.head[i]==elem){
return (i+1);
}
}
return (-1)
}
table amendTable(table t,int )
//输出顺序表中元素的函数
void displayTable(table t){
for(int i=0;i<t.length;i++){
printf("%d",t.head[i]);
}
printf("\n");
}
//table
int main() {
table t=initTable();
// 向顺序表里面添加元素
for(int i=1;i<=Size;i++){
t.head[i-1]=i;
t.length++;
}
printf("顺序表中的元素分别是:\n");
return (0);
}
顺序表的实现
祝大家考试顺利呀~