//10.4单链表基本运算
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
char data; //data为节点的数据信息
struct node *next; //next为指向后继节点的指针
}LNode; //单链表节点类型
LNode *CreateLinkList() //在表尾生成单链表
{
LNode *head, *p, *q;
char x;
head = (LNode *)malloc(sizeof(LNode)); //生成头节点
head->next = NULL;
p = head;
q = p; //指针q始终指向链尾节点
printf("Input any char string:\n");
scanf("%c", &x); //读入节点数据
while (x != '\n')
{
p = (LNode *)malloc(sizeof(LNode)); //生成待插入节点的存储空间
p->data = x; //将读入的数据赋给待插入节点*p
p->next = NULL; //待插入节点*p作为链尾节点时其后继指针为空
q->next = p; //在链尾插入*p节点
q = p; //q继续指向新的链尾节点*p
scanf("%c", &x);
}
return head; //返回单链表表头指针
}
int Length_LinkList(LNode *head) //求单链表的长度
{
LNode *p = head; //p指向单链表头节点
int i = 0; //i为节点计数器
while (p->next != NULL)
{
p = p->next;
i++;
}
return i;
}
LNode *Get_LinkList(LNode *head, int i)
{ //在单链表head中按序号查找第i个节点
LNode *p = head;
int j = 0;
while (p != NULL && j < i) //由第一个数据节点开始查找
{
p = p->next;
j++;
}
return p; //找到则返回指向i节点的指针值,找不到则p为空,返回空值
}
LNode *Locate_LinkList(LNode *head, char x)
{ //在单链表中查找结点值为x的节点
LNode *p = head->next;
while (p != NULL && p->data != x) //由第一个数据节点开始查找
{
p = p->next;
}
return p;
}
void Insert_LinkList(LNode *head, int i, char x)
{ //在单链表head的第i个位置上插入值为x的元素
LNode *p, *s;
p = Get_LinkList(head, i - 1); //查找第i-1个节点
if (p == NULL)
{
printf("Error!\n"); //第i-1个位置不存在而无法插入
}
else
{
s = (LNode *)malloc(sizeof(LNode)); //申请节点空间
s->data = x;
s->next = p->next; //s->next 中存放的是原来p的后继节点
p->next = s; //s成为p的后继节点
}
}
void Del_LinkList(LNode *head, int i)
{ //删除单链表head上的第i个数据节点
LNode *p, *s;
p = Get_LinkList(head, i - 1); //查找第i-1个节点
if (p == NULL)
{
printf("第i-1个节点不存在!\n");
//待删节点的前一个节点不存在,也就没有待删节点
}
else
{
if (p->next != NULL)
{
printf("第i个节点不存在!\n"); //待删节点不存在
}
else
{
s = p->next; //s指向第i个节点
p->next = s->next; //从链表中删除第i个节点 s->next 就是p->next->next;
free(s); //系统回收第i个节点的存储空间
}
}
}
void print(LNode *h) //输出单链表
{
LNode *p;
p = h->next;
while (p != NULL)
{
printf("%c", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
LNode *h, *p;
int i;
char x;
h = CreateLinkList(); //生成一个单链表
print(h); //输出单链表
i = Length_LinkList(h); //求单链表的长度
printf("Length = %d\n", i); //输出单链表的长度值
printf("Input order and search to element:\n");
scanf("%d", &i); //输入要查找元素的序号
p = Get_LinkList(h, i); //按序号在顺序表中查找
if (p != NULL)
{
printf("Element is %c\n", p->data); //找到则输出该元素的值
}
else
{
printf("Search fail!\n"); //未找到
}
printf("Input value of element and search to element:\n");
getchar();
scanf("%c", &x); //输入要查找元素的值
p = Locate_LinkList(h, x); //按值在顺序表中查找
if (p != NULL)
{
printf("Element is %c\n", p->data); //找到则输出该元素的值
}
else
{
printf("Search fail!\n"); //未找到
}
printf("Insert a element, Input site and value of element:\n");
scanf("%d%c", &i, &x); //输入要插入元素的位置值i和元素值x
Insert_LinkList(h, i, x); //在单链表中插入该元素
print(h); //输出单链表
printf("Delete a element, Input site of element:\n");
scanf("%d", &i); //输入要删除元素的位置值i
Del_LinkList(h, i); //在单链表中删除该位置上的元素
print(h); //输出单链表
return 0;
}
10.4单链表基本运算
最新推荐文章于 2024-11-13 09:46:28 发布