欢迎各位大神指正~
#include<stdio.h>
#include<stdlib.h>
#define SUCCESS 0; //成功的返回值
#define ERROR -1; //失败的返回值
typedef char ElemType; //结点元素类型
//结点结构体
typedef struct Node
{
ElemType data;
struct Node *next; //指向下一个结点的指针
}Node;
//创建并初始化单链表(头结点)
Node * initlinkList()
{
Node *linkList = (Node *)malloc(sizeof(Node)); //动态申请内存空间
linkList->next = NULL; //初始化next指针
return linkList;
}
//创建结点
Node * createNode(ElemType data){
Node *node = (Node *)malloc(sizeof(Node)); //动态申请内存空间
node->data = data; //给新结点赋值
node->next = NULL;
return node;
}
//头插法插入数据
int insertlinkList(ElemType data, Node *linkList)
{
Node *newNode = createNode(data); //创建一个新结点
Node *p = linkList->next; //将头结点的next地址赋值给工具人指针p
linkList->next = newNode; //头结点的next指向新结点
newNode->next = p; //新结点的next指向工具人指针指向的结点地址
return SUCCESS;
}
int insertByIndex(Node *linkList,int i,ElemType data) //根据索引插入结点(在i结点的后面插入)
{
if (i <= 0) return -1; //判断位置是否合理
Node *p = linkList; //工具人指针指向头结点
int k = 0;
while (p->next != NULL && k<i)
{
p = p->next;
k++;
}
printf("在 %c 元素后面插入%c\n", p->data,data);
Node *newNode = createNode(data); //创建新结点
newNode->next = p->next; //新结点的next指向p指针指向的结点地址
p->next = newNode; //更新p指针指向的结点的next
return SUCCESS;
}
//更新某个结点的信息
int updataByIndex(Node *linkList,int i, ElemType data)
{
Node *p = linkList;
if (p == NULL) return -1;
int k = 0;
while (p->next != NULL && k<i)
{
p = p->next;
k++;
}
printf("修改的元素为:%c 修改为:%c\n", p->data,data);
p->data = data;
return SUCCESS;
}
//根据索引 i 删除结点
int deletelinkList(Node *linkList, int i)
{
Node *p = linkList;
if (p->next == NULL) return -1;
int k = 0;
while (p->next != NULL && k<i-1) //将p指针指向 i-1 结点的地址
{
p = p->next;
k++;
}
//printf("删除元素的前一个元素是: %d \n", p->data);
Node *deleteNode = p->next; //被删除的结点
printf("被删除的元素为:%c\n", deleteNode->data);
p->next = deleteNode->next; //跳过被删除的结点
free(deleteNode); //释放内存空间
return SUCCESS;
}
//遍历单链表
void showlinkList(Node *linkList)
{
Node *p = linkList->next;
while (p != NULL)
{
printf("%c ", p->data);
p = p->next;
}
printf("\n");
}
//获取单链表的长度
int getLength(Node *linkList){
if (linkList == NULL) return ERROR;
Node *p = linkList;
int length = 0;
if (p->next == NULL){
printf("当前单链表的长度为%d\n",length);
return SUCCESS;
}
while (p->next != NULL)
{
p = p->next;
length++;
}
printf("当前单链表的长度为%d\n", length);
return SUCCESS;
}
int main(){
Node *linkList = initlinkList();
getLength(linkList);
putchar('\n');
printf("头插法插入元素\n");
insertlinkList('A', linkList);
insertlinkList('B', linkList);
insertlinkList('C', linkList);
showlinkList(linkList);
putchar('\n');
insertByIndex(linkList, 1, 'D');
showlinkList(linkList);
putchar('\n');
updataByIndex(linkList, 2, 'E');
showlinkList(linkList);
putchar('\n');
deletelinkList(linkList, 2);
showlinkList(linkList);
putchar('\n');
getLength(linkList);
return 0;
}
运行效果: