#include<stdio.h>
#include<stdlib.h>
//定义链表的结构体
typedef struct node{
char data;
struct node *next;
}ListNode;
/*********************************
*函数功能:创建一个链表
*参 数:无
*返 回 值:链表首结点的地址
**********************************/
ListNode *createLink()
{
char ch;
//头结点
ListNode *head = (ListNode *)malloc(sizeof(ListNode));
ListNode *r,*s;
if(!head)
exit(-1);
r = head;
//从键盘中读入数据
while((ch = getchar()) != '\n')
{
s = (ListNode *)malloc(sizeof(ListNode));
s->data = ch;
r->next = s;
//为了s指向下一个地址做准备
r = s;
}
//尾结点
r->next = NULL;
return head;
}
/*********************************
*函数功能:输出一个链表
*参 数:链表的首个节点
*返 回 值:无
**********************************/
void outLink(ListNode *head)
{
//从头结点的下一个结点开始输出
ListNode *p = head->next;
while(p != NULL)
{
//输出数据
printf("%c",p->data);
//指针域后移
p = p->next;
}
printf("\n");
}
/******************************************************
*函数功能:查找链表中的指定元素的位置
*参 数:*head:链表的首个节点,i:指定的位置
*返 回 值:成功返回:该结点的位置,失败返回:NULL
*******************************************************/
ListNode * findNode(ListNode *head,int i)
{
int j = 0;
ListNode *p = head;
//通过循环找到第i个结点
while(p->next && j < i)
{
//指针域后移,指向下一个结点
p = p ->next;
j++;
}
//查找到结点
if(j == i)
{
//返回该结点
return p;
}
else
{
return NULL;
}
}
/*****************************************************************************
*函数功能:向链表中指定位置插入数据
*参 数:*head:链表的首个节点,i:指定的位置,x:指定的元素
*返 回 值:无
******************************************************************************/
void insertNode(ListNode *head,int i,char x)
{
ListNode *p,*q;
//找到要插入的位置
p = findNode(head,i - 1);
if(p == NULL)
{
printf("没有找到位置\n");
}
//创建一个新的结点
q = (ListNode *)malloc(sizeof(ListNode));
//插入结点
q->data = x;
//断链重连,并且这两条语句的顺序不可改变,否则新插入的结点将自己指向自己
q->next = p->next;
p->next = q;
}
/*****************************************************************************
*函数功能:删除链表中的结点
*参 数:*head:链表的首个节点,i:指定的位置
*返 回 值:无
******************************************************************************/
void deleteNode(ListNode *head,int i)
{
ListNode *p;
//查找结点
p = findNode(head,i);
//删除结点
p->next = p->next->next;
}
/*****************************************************************************
*函数功能:逆置链表中的结点
*参 数:*head:链表的首个节点
*返 回 值:无
******************************************************************************/
ListNode *diverseLinkList(ListNode *head)
{
ListNode *begin = NULL,*mid = head->next,*end = head->next->next;
if(head == NULL || head->next == NULL)
{
printf("该表为空");
exit(1);
}
while(1)
{
mid->next = begin;
if(end == NULL)
break;
begin = mid;
mid = end;
end = end->next;
}
//逆置完成
head->next = mid;
return head;
}
int main()
{
char x;
int i;
ListNode *head,*p;
//链表初始化
printf("请输入创建链表的连续元素:\n");
head = createLink();
//输出链表
outLink(head);
//删除元素
//deleteNode(head,0);
//输出链表
//outLink(head);
diverseLinkList(head);
outLink(head);
return 0;
}
以上代码包含单链表的插入、删除、查找、逆序。