/*
* @Author : M&G
* @since : 2023-03-29 18:17:37
* @lastTime : 2023-03-29 22:12:18
* @FilePath : /fuxi/1_day/link.c
* @Description:
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
typedef struct node
{
int data;
struct node *next;
} Link_t, *Link_p;
//计算链表长度
int lenLink(Link_p p);
//创建节点
Link_p createLink(Link_p p, int data);
//指定位置插入数据
int insterPortNode(Link_p p, int port, int data);
//遍历链表
void showLinkData(Link_p p);
//转置
int swap(Link_p p);
//判空
int isFullLink(Link_p p);
int main(int argc, const char argv[])
{
Link_p p = (Link_p)malloc(sizeof(Link_t));
if (p == NULL)
{
printf("malloc err\n");
return -1;
}
createLink(p, 10);
createLink(p, 20);
insterPortNode(p, 1, 11);
showLinkData(p);
swap(p);
showLinkData(p);
}
//创建头节点
// Link_p createHeadNode()
// {
// Link_p pnew = (Link_p)malloc(sizeof(Link_t));
// if(pnew == NULL)
// {
// printf("createHead err\n");
// return NULL;
// }
// pnew->next
// }
//创建节点
Link_p createLink(Link_p p, int data)
{
//创旧爱
Link_p pnew = (Link_p)malloc(sizeof(Link_t));
if (pnew == NULL)
{
printf("create err\n");
return NULL;
}
pnew->data = data;
pnew->next = NULL;
pnew->next = p->next;
p->next = pnew;
return p;
}
//指定位置插入数据
int insterPortNode(Link_p p, int port, int data)
{
Link_p pnew = (Link_p)malloc(sizeof(Link_t));
if (pnew == NULL || (port > lenLink(p) + 1) || port < 1)
{
printf("inster err\n");
return -1;
}
pnew->next = NULL;
pnew->data = data;
while (--port)
{
p = p->next;
printf("%d\n", p->data);
}
//保存下一个节点的地址
Link_p ptem = p->next;
p->next = pnew;
pnew->next = ptem;
return 1;
}
//计算链表长度
int lenLink(Link_p p)
{
int len = 0;
if (isFullLink(p))
{
printf("长度为零!\n");
return -1;
}
while (p != NULL)
{
len++;
p = p->next;
}
return len;
}
//遍历链表
void showLinkData(Link_p p)
{
p = p->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
//sleep(1);
}
putchar(10);
}
//判空
int isFullLink(Link_p p)
{
if (p->next == NULL)
{
return 1;
}
else
return 0;
}
//转置
int swap(Link_p p)
{
//
//Link_p ptem = p;
Link_p phead = p->next;
Link_p pnext = p->next;
p->next = NULL;
while (pnext)
{
//pnext phead保存下一个头节点的位置
//断头 pnext向后移动 把头砍下来(phead)
//不能将这一句放到后边,指向的同一个位置,
pnext = pnext->next;
phead->next = NULL;
//将头接到头节点后面
phead->next = p->next;
p->next = phead;
//拿到下一个新头
phead = pnext;
//Low = Low->next;
}
}
版权声明:本文为Black_MG原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。