单链表的基本操作
【实验目的】
复习C语言程序设计中的知识,掌握线性表的链式存储结构的表示和实现方法。
掌握单链表上实现插入、删除和查找等操作。
【实验内容】
建立单链表
在单链表上实现插入、删除和查找等操作,使用菜单。
【实验要求】
编写实现单链表的基本算法(初始化、查找、插入、删除等)的函数,并在此基础上设计一个主程序完成如下功能:
(1)初始化单链表H,类型自选(我选用的是整型);
(2)分别使用头插法和尾插法建立单链表H;
(3)输出单链表H的长度;
(4)输出单链表H的第i个元素;
(5)输出给定元素的位置;
(6)在第i个元素前插入给定元素;
(7)删除单链表H的第i个元素;
(8)输出单链表。
#include "stdio.h"
#include "stdlib.h"
typedef int elemtype;
typedef struct node
{
elemtype data;
struct node* next;
}node, * linklist;
int initlist(linklist head)//初始化
{
head = (linklist)malloc(sizeof(node));
head->next = NULL;
printf("初始化成功.\n");
}
linklist Greatelist_head(linklist head)//头插法建立单链表
{
linklist s; int x;
head = (node*)malloc(sizeof(node));
head->next = NULL;
scanf("%d", &x);
while (x != 0)
{
s = (node*)malloc(sizeof(node));
s->data = x;
s->next = head->next;
head->next = s;
scanf("%d", &x);
}
return head;
}
linklist Greatlist_tail(linklist head)//尾插法建立单链表
{
int x;
head = (node*)malloc(sizeof(node));
node* s, * r = head;
scanf("%d", &x);
while (x != 0)
{
s = (node*)malloc(sizeof(node));
s->data = x;
r->next = s;
r = s;
scanf("%d", &x);
}
r->next = NULL;
return head;
}
int linklist_length(linklist head)//单链表长度
{
linklist p;
p = head->next;
int j = 0;
while (p)
{
j++;
p = p->next;
}
return j;
}
linklist GetData_linklist(linklist head, int i, int value)//按位置查找
{
linklist p;
int j = 0;
printf("输入想查找的元素的位置:\n");
scanf("%d", &i);
if (i <= 0)
return NULL;
p = head;
while (p->next && j < i)
{
p = p->next;
j++;
}
if (i == j)
{
value = p->data;
printf("找到第%d个元素的值为:%d\n", i, value);
}
else printf("查找失败!\n");
}
node* Search_linklist(linklist head, int key)//按内容查找
{
node* p; int s = 1;
p = head->next;
printf("输入想查找的元素:\n");
scanf("%d", &key);
while (p != NULL)
{
if (p->data != key)
{
s = s + 1;
p = p->next;
}
else
{
printf("元素%d的位置是:%d\n", key, s);
break;
}
}
}
int Inslist(linklist head, int i, int e)//插入
{
node* pre, * s;
int k;
printf("插入位置和插入元素分别为:");
scanf("%d%d", &i, &e);
pre = head; k = 0;
while (pre != NULL && k < i - 1)
{
pre = pre->next;
k = k + 1;
}
if (!pre)
{
printf("插入位置不合理!\n");
}
else
{
s = (node*)malloc(sizeof(node));
s->data = e;
s->next = pre->next;
pre->next = s;
}
}
int Delete_linklist(linklist head, int i)//删除
{
node* p, * r;
int k;
printf("要删除的元素位置为:");
scanf("%d", &i);
p = head; k = 0;
while (p->next != NULL && k < i - 1)
{
p = p->next;
k = k + 1;
}
if (k != i - 1)
{
printf("删除的位置不合理\n");
return 0;
}
r = p->next;
p->next = r->next;
free(r);
return 1;
}
void printlist(linklist head)//输出
{
linklist p;
p = head->next;
printf("链表元素如下:\n");
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void menu()//菜单
{
printf("--------------主菜单--------------\n\t\n");
printf("-----------0.退出-----------------\n\t\n");
printf("-----------1.链表初始化-----------\n\t\n");
printf("-----------2.头插法建立单链表-----\n\t\n");
printf("-----------3.尾插法建立单链表-----\n\t\n");
printf("-----------4.输出单链表的长度-----\n\t\n");
printf("-----------5.按位置查找-----------\n\t\n");
printf("-----------6.按值查找-------------\n\t\n");
printf("-----------7.插入给定元素---------\n\t\n");
printf("-----------8.删除某个元素---------\n\t\n");
printf("-----------9.遍历链表-------------\n\t\n");
}
int main()//主函数
{
linklist head; node* p; int len, i, value, k, j, e, y, s, c;
menu();
do
{
printf("输入你想要进行的操作选项:\n");
scanf("%d", &c);
switch (c)
{
case 0:break;
case 1:initlist(head);//初始化链表
break;
case 2:printf("头插法建立单链表,输入值(0结束)\n");
head = Greatelist_head(head);
printlist(head);
break;
case 3:printf("尾插法建立单链表,输入值(0结束)\n");
head = Greatlist_tail(head);
printlist(head);
break;
case 4:len = linklist_length(head);
printf("链表的表长为:%d\n", len);
break;
case 5:GetData_linklist(head, i, value);
break;
case 6:Search_linklist(head, k);
break;
case 7:Inslist(head, j, e);
printlist(head);
break;
case 8:Delete_linklist(head, y);
printlist(head);
break;
case 9:printlist(head);
break;
}
} while (c);
}