数据结构单链表的基本运算船舰插入遍历查找删除
#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; //初始时链表为空,即*head既为头节点又为尾节点
q = head; //指针p始终指向链尾节点
printf("Input any char string : \n");
scanf("%c", &x); //节点数据与为char型,读入节点数据
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) //未到链尾且当前节点不等于x时继续查找
p = p->next;
return p; //若找到则返回指向x节点的指针值,若找不到则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个节点,此后在其后第i个位置插入值为x的元素
else
{
s = (LNode*)malloc(sizeof(LNode)); //申请节点空间
s->data = x;
s->next = p->next;
p->next = s;
}
}
void Del_LinkList(LNode* head, int i) //删除单链表head上第i个数据节点
{
LNode* p, * q;
p = Get_LinkList(head, i - 1); //查找第i-1个节点
if (p == NULL) //若待删除i节点不存在,则无待删除i节点
printf("第i-1个节点不存在!\n");
else
if (p->next == NULL) //找到第i-1个节点为链尾节点
printf("第i个节点不存在!\n");
else
{
q = p->next;
p->next = q->next;
free(q); //若待删除i节点存在,则删除待删除i节点
}
}
void print(LNode* h) //输出单链表
{
LNode* p;
p = h->next;
while (p != NULL)
{
printf("%c, ",p->data);
p = p->next;
}
printf("\n");
}
void 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");
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);
Insert_LinkList(h, i, x);
print(h);
printf("Delete a element,Input site of element:\n");
scanf("%d", &i);
Del_LinkList(h, i);
print(h);
}