#include <stdio.h>
#include <stdlib.h>
/*
实现单链表
*/
//定义链表节点
typedef struct Node {
int elem;
struct Node * next;
}node;
//链表长度
int len = -1;
//创建一个节点
node* getNode();
//向链表尾部添加元素
int add(node* linkP, int e);
//得到索引位置的节点
node* get(node* linkP, int index);
//删除元素
int delete(node** linkP,int index);
int set(node* link,int e,int index);
//索引越界检查
int rangeCheck(int index);
int main() {
//初始化链表
node* link = getNode();
//添加元素
add(link,0);
add(link, 1);
add(link, 2);
//得到元素
node* n1= get(link,0);
//删除元素
delete(&link,1);
//改变元素
set(link, 5, 1);
printf("xxx");
return 0;
}
int add(node* link, int e) {
if (link==NULL)
{
//printf("空指针异常");
return 0;
}
node* temp= link;
//遍历链表,直到末尾
while (temp->next != NULL)
{
temp = temp->next;
}
//到达尾部,创建新节点
node* p= getNode();
temp->elem = e;
temp->next = p;
len++;
return 1;
}
node* get(node* link, int index) {
if (!rangeCheck(index))
{
return NULL;
}
node* temp = link;
int flag = index;
//遍历链表,直到索引位
while (flag)
{
temp = temp->next;
flag--;
}
return temp;
}
int delete(node** linkP, int index) {
node* link = *linkP;
if (!rangeCheck(index))
{
return 0;
}
//如果是删除头节点
if (index==0)
{
//得到第二个节点作为头节点
node* last = link->next;
free(link);
link = NULL;
//通过二级指针,修改链表指针
*linkP = last;
len--;
return 1;
}
//如果是删除尾节点
if (index==len)
{
//尾部的前一节点
node* last2= get(linkP, index - 1);
//释放内存并设置为NULL防止野指针
free(last2->next);
last2->next = NULL;
len--;
return 1;
}
//如果是删除中间,先得到索引位的前节点
node* pre= get(link,index-1);
node* last = pre->next->next;
//释放删除的节点
free(pre->next);
//指向后一节点
pre->next = last;
len--;
return 1;
}
int set(node* link, int e, int index) {
if (!rangeCheck(index))
{
return 0;
}
node* realNode = get(link,index);
realNode->elem = e;
return 1;
}
node* getNode() {
node* p = (node*)malloc(sizeof(node));//创建一个结点
p->next = NULL;
return p;
}
int rangeCheck(int index) {
if (index<0 || index>len)
{
printf("无效索引位");
return 0;
}
return 1;
}
04-01
03-09
1062