实现单链表的基本运算:初始化、插入、删除、求表的长度、判空、释放。
(1)初始化单链表L,输出L->next的值;
(2)依次采用尾插法插入元素:输入分两行数据,第一行是尾插法需要插入的字符数据的个数,第二行是具体插入的字符数据。
(3)输出单链表L;
(4)输出单链表L的长度;
(5)判断单链表L是否为空;
(6)输出单链表L的第3个元素;
(7)输出元素a的位置;
(8)在第4个元素位置上插入‘x’元素;
(9)输出单链表L;
(10)删除L的第3个元素;
(11)输出单链表L;
(12)释放单链表L。
输入格式:
两行数据,第一行是尾插法需要插入的字符数据的个数,第二行是具体插入的字符数据。
输出格式:
按照题目要求输出
输入样例:
5
a b c d e
输出样例:
0
a b c d e
5
no
c
1
a b c x d e
a b x d e
#include <stdio.h>
#include <malloc.h> //malloc 头文件
typedef struct List //链表的节点
{
char data;
struct List *next;
}*ListNode, listnode;
bool initList(ListNode& node) //注意返回值 链表初始化
{
node = (ListNode)malloc(sizeof(listnode));
node->next = NULL;
return node->next!=NULL;
}
void createList(ListNode& node, char a[],int num) //链表产生 输入由外部传入
{
char data;
ListNode tempNode, pMove;
pMove = node;
for (int j =0; j<num; j++)
{
tempNode = (ListNode)malloc(sizeof(listnode));
pMove->next = tempNode; //使用了尾插
tempNode->data = a[j];
tempNode->next = NULL;
pMove = tempNode;
}
}
void//打印
输出链表 show(ListNode node)
{
ListNode pMove=node->next;
while (pMove != NULL) //循环遍历
{
printf("%c", pMove->data);
if (pMove->next != NULL) //为了题目需要最后一个不输出空格
printf(" ");
pMove = pMove->next;
}
printf("\n");
}
int showLen(ListNode node) //返回链表长度
{
ListNode p = node->next;
int i=0;
while (p)
{
i++;
p = p->next;
}
return i;
}
bool showEmpty(ListNode node) //判断链表是否为空
{
return node->next == NULL;
}
char showEle(ListNode node, int num) //判断num位置的元素
{
ListNode temp = node;
for (int i = 0; i<num; ++i)
{
temp = temp->next;
}
return temp->data;
}
int showLocate(ListNode node, char data) //判断data数据的位子
{
int i = 0;
ListNode temp = node;
while (temp->data != data&&temp!=NULL)
{
i++;
temp = temp->next;
}
if (temp == NULL)
return 0;
else
return i;
}
bool insertEle(ListNode& node, int num, char data) //插入数据
{
if (num <= 0) //判断num是否是有效值
return false;
ListNode pTemp = node;
for (int i = 0; i<num - 1; ++i) // 插入需要找到插入的前一个点
{
pTemp = pTemp->next;
}
if (pTemp==NULL)
return false;
else
{
ListNode temp = (ListNode)malloc(sizeof(listnode));
temp->data = data;
temp->next = pTemp->next;
pTemp->next = temp;
return true;
}
}
bool deleteEle(ListNode& node, int num) //删除第i个元素
{
if (num <= 0)
return false;
ListNode temp = node,p;
for (int i = 0; i<num - 1&&temp!=NULL; i++) //找到删除数据的前一个节点
{
temp = temp->next;
}
if (temp==NULL&&temp->next==NULL) //判断删除点的前一个点和删除点是否为空如果有一个为空说明该点不存在
return false;
else
{
p = temp->next; //断开删除点的指针
temp->next = p->next;
free(p); //释放删除点
return true;
}
}
void deleteList(ListNode& node) //删除链表
{
ListNode p = node, q;
while (p != NULL)
{
q = p->next;
free(p);
p = q;
}
node = NULL;
}
int main()
{
ListNode text;
int num;
scanf("%d", &num); //输入数据个数
char *data=(char*)malloc(sizeof(char)*(num+1));
for (int i = 0; i < num; ++i) //输入数据
{
getchar();
scanf("%c", &data[i]);
}
bool a = initList(text);
createList(text,data,num);
printf("%d\n", a);
show(text);
//略
return 0;
}
最后输出没有写完整,希望同学们要看一下函数内容自行调用函数。