基础项目:
<1>创建一个空链表;
<2>用尾插法通过键盘输入创建一个含有若干结点的非空链表(可以在创建函数中通过调用插入函数新建/插入一个个结点);
<3>输出单链表各结点;
<4>查找第i个位置上的结点,并将结点值输出;
<5>在单链表head中第i个位置上插入元素值为x的新结点;
<6>判断单链表是否为空;
<7>删除第i个位置上的结点;
<8>删除整个单链表。
拓展项目:
<1>对已有链表按结点数据值大小进行递增排序。排序后,在该链表中插入一个值为85的元素,并保持其递增有序特性。函数名:sortlist( );
<2>请为所有操作添加选择菜单。
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node
{
datatype data;
struct node* next;
}linklist;
typedef linklist* List;
/*创建一个空链表,返回指向链表的指针*/
linklist* creatList();
/*创建一个非空链表(按尾插法创建),返回指向链表的指针*/
linklist* creatList1();
/*在单链表head中p结点之后插入元素X为新结点*/
void insertXtoList(linklist* head, linklist* p, datatype x);
/*按从前向后的顺序显示链表中的元素值*/
void displaylist(linklist* head);
/*在某个位置插入一个新结点*/
linklist* Insert(linklist* head, int i, datatype x);
/*判断链表head是否为空,为空返回1,否则返回0*/
int isEmpty(linklist* head);
/*查找第i个位置上的元素结点并返回*/
linklist* locateItem(linklist* head, int Index);
/*删除第i个位置上的元素结点*/
linklist* Delete(linklist* head, int i);
/*删除链表,即删除所有结点*/
void deleteList(linklist* head);
/*将单链表head置空*/
linklist* setnull(linklist* head);
int main()
{
//空表创建及判断
List head_NULL = creatList();
displaylist(head_NULL);
//尾插法创建表
List head1 = creatList1();
displaylist(head1);
//查询操作
int i;
datatype e;
printf("请输入您需要查找的数据元素的结点位置:");
scanf_s("%d", &i);
printf("第%d个结点上的数据为:%d\n", i, locateItem(head1, i)->data);
//删除操作
printf("请问您需要删除第几个元素?\n");
scanf_s("%d", &i);
displaylist(Delete(head1, i));
//插入操作
printf("请输入您需要插入的位置和数据:\n");
scanf_s("%d%d", &i, &e);
displaylist(Insert(head1, i, e));
//传入结点地址在其后插入新的数据
printf("请输入您要插入的位置和数据:\n");
scanf_s("%d%d", &i, &e);
insertXtoList(head1, locateItem(head1, i), e);
displaylist(head1);
return 0;
}
/*创建一个空链表,返回指向链表的指针*/
linklist* creatList()
{
List head = (List)malloc(sizeof(linklist));
if (head != NULL) {
head->next = NULL;
head->data = 0;
}
return head;
}
/*将单链表head置空*/
linklist* setnull(linklist* head)
{
List t;
t = head->next; //t为链表中第一个结点的地址
head->next = NULL;
return t;
}
/*创建一个非空链表(按尾插法创建),返回指向链表的指针*/
linklist* creatList1()
{
List head, p, s;
int n;
datatype data;
printf("请问,您需要输入几个数据?\n");
scanf_s("%d", &n);
if (n <= 0) {
printf("数据个数不合理,创建失败!\n");
return NULL;
}
head = (List)malloc(sizeof(linklist));
if (head != NULL) {
/*下面这段代码通过调用插入函数实现尾插法建表
head->next = NULL;
head->data = 0;
for (int i = 0; i < n; i++) {
printf("请输入第%d个数据:", i + 1);
scanf_s("%d", &data);
Insert(head, i + 1, data);
head->data++;
}*/
//正常的尾插法建表
head->data = 0;
s = head;
for (int i = 0; i < n; i++) {
p = (linklist*)malloc(sizeof(linklist));
if (p != NULL) {
printf("请输入第%d个数据:", i + 1);
scanf_s("%d", &p->data);
s->next = p;
s = p;
head->data++;
}
}
s->next = NULL;
return head;
}
}
/*按从前向后的顺序显示链表中的元素值*/
void displaylist(linklist* head)
{
List p;
p = head->next;
if (isEmpty(head)) {
printf("该表为空表!\n**********\n\n");
return;
}
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n该表长为:%d", head->data);
printf("\n**********\n\n");
}
/*在某个位置上插入一个新结点*/
linklist* Insert(linklist* head, int i, datatype x)
{
List p, t;
//找到第i-1个结点------调用查找结点的函数(函数的嵌套调用)
p = locateItem(head, i - 1);
t = (List)malloc(sizeof(linklist));
if (t != NULL) {
t->data = x;
t->next = p->next;
p->next = t;
head->data++;
}
return head;
}
/*删除某个位置上的结点*/
linklist* Delete(linklist* head, int i)
{
List p, s;
//查找到第i-1个结点
p = locateItem(head, i - 1);
s = p->next;
p->next = s->next;
free(s);
head->data--;
return head;
}
/*判断链表head是否为空,为空返回1,否则返回0*/
int isEmpty(linklist* head)
{
if (head->next == NULL) {
return 1;
}
return 0;
}
/*查找第i个位置上的元素结点并返回*/
linklist* locateItem(linklist* head, int Index)
{
List p;
p = head;
for (int k = 0; k < Index; k++) {
p = p->next;
}
return p;
}
/*删除链表,即删除所有结点*/
void deleteList(linklist* head)
{
List p, s;
p = head;
while (p != NULL)
{
s = p->next;
free(p);
p = s;
}
free(p);
}
/*在单链表head中p结点之后插入元素X为新结点*/
void insertXtoList(linklist* head, linklist* p, datatype x) {
List t, s;
t = head;
while (t->next != p && t != NULL) {
t = t->next;
}
if (t == NULL) {
printf("插入位置的前一个结点不存在!\n");
return;
}
s = (List)malloc(sizeof(linklist));
if (s != NULL) {
s->data = x;
s->next = t->next;
t->next = s;
head->data++;
}
}