#include <stdio.h>
#include <stdlib.h>
//01定义节点
typedef int data_t;
typedef struct Node{
data_t data;
struct Node* next;
}linklist;
//02节点的初始化以及创建
linklist* create_linklist()
{
linklist* head = (linklist*) malloc(sizeof(linklist));//创建头节点
head->data = -1;
head->next = NULL;
return head;
}
//03判断是不是空
int linklist_is_empty(linklist* head)
{
if(NULL == head)
{
printf("开辟空间失败\n");
return -1;
}
if(head->next == NULL)
{
printf("表目前为空");
return 1;
}
else
{
return -1;
}
}
//04打印表
void show_linklist(linklist* head)
{
if(NULL == head)
{
printf("开辟空间失败\n");
return ;
}
if(linklist_is_empty(head) == 1)
{
printf("表为空,无法打印\n");
return ;
}
linklist* p = head->next;
while(p != NULL)
{
printf("%-3d",p->data);
p = p->next;
}
printf("\n");
}
//05求表长
int get_length_linklist(linklist* head)
{
if(NULL == head)
{
printf("开辟空间失败\n");
return -1;
}
int len = 0;
linklist* p = head->next;
while(p != NULL)
{
p = p->next;
len++;
}
return len;
}
//06头插入
int insert_by_head(linklist* head,data_t value)
{
if(NULL == head)
{
printf("开辟空间失败\n");
return -1;
}
linklist* ne_w = (linklist*) malloc(sizeof(linklist));
ne_w->data = value;
ne_w->next = head->next;
head->next = ne_w;
return 0;
}
//07按位置插入
int insert_by_pos_linklist(linklist* head,int pos,int value)
{
if(NULL == head)
{
printf("开辟空间失败\n");
return -1;
}
int len = 0;
len = get_length_linklist(head);
//判断位置合法性
if(pos < 0||pos > len){
return -1;
}
//定义p指针 和new节点
linklist* p = head;
linklist *ne_w = (linklist *)malloc(sizeof(linklist));
ne_w->data = value;
ne_w->next = NULL;
//遍历到pos -1的位置
while(pos--)
{
p = p->next;
}
//开始插入
ne_w->next = p->next;
p->next = ne_w;
return 0;
}
//08按位置删
int del_by_pos_linklist(linklist* head,data_t pos)
{
if(NULL == head) return -1;
int len = get_length_linklist(head);
//判断位置合法性
if(pos < 0 || pos > len-1 ) return -1;
//准备p指针
linklist* p = head;
while(pos--)
{
p = p->next;
}
//准备指针q备份删除的pos节点
linklist* q = p->next;
//将pos+1的节点 接到p的后边
p->next = q->next;
//删除pos节点
free(q);
q = NULL;
return 0;
}
//09按位置查值
int find_by_pos(linklist* head,int pos)
{
//判断head
if(NULL == head) return -1;
//判断位置合法性
int len = get_length_linklist(head);
if(pos <0 || pos >len-1)return -1; //pos : 0-len-1
//准备p指针遍历到pos-1位置
linklist* p = head->next;
while(pos--)
{
p = p->next;
}
//返回值
return p->data;
}
//10按位置改值
int change_by_pos(linklist* head,int pos,data_t newval)
{
//1、判断head
if(NULL == head) return -1;
//2、判断位置合法性
int len = get_length_linklist(head);
if(pos <0 || pos >len-1) return -1; //pos : 0-len-1
//3、准备指针遍历到pos处
linklist* p = head->next;
while(pos--)
{
p = p->next;
}
//改值
p->data = newval;
return 0;
}
//主函数
int main()
{
//02
linklist* head = create_linklist();
if(NULL == head)
{
return -1;
}
int n = 5,i = 0;
for(i = 0;i<n;i++)
{
//06
insert_by_head(head,i+1);
}
//04
show_linklist(head);
//05
int len = get_length_linklist(head);
printf("表长为:%d\n",len);
//07
printf("2的位置插入2\n");
insert_by_pos_linklist(head,2,2);
show_linklist(head);
//08
printf("删除2位置的值\n");
del_by_pos_linklist(head,2);
show_linklist(head);
//09
printf("查2位置的值:\n");
int num = find_by_pos(head,2);
printf("%d\n",num);
//10
printf("改2位置的值为5:\n");
change_by_pos(head,2,5);
show_linklist(head);
return 0;
}