//单链表的练习
#include "stdlib.h"
#include "stdio.h"
void printLinkList(struct node *h);
//单链表数据结构
typedef struct node {
int data; //数据域
struct node *next; //指针域
}Lnode,*LinkList;
//创建链表 带头结点
LinkList createLinkList(int n)
{
struct node *h, *p, *q;
int i;
p=(struct node *)malloc(sizeof(struct node));
h=p;
q=p;
for(i=0;i<n;i++)
{
p=(struct node *)malloc(sizeof(struct node));
printf("请输入第%d个元素的值:", i+1);
scanf("%d", &(p->data));
q->next=p;
q=p;
}
q->next=NULL;
return h;
}
//查找链表中某个数据
//查找操作不涉及修改链表中的节点位置,所以依然返回之前的头结点,不作修改
LinkList FindElem(LinkList h){
LinkList p = h->next;
int data;
printf("请输入要查找的元素:\n");
scanf("%d",&data);
int i = 1;
int flag = 0;
while(p!= NULL){
if (data == p->data){
printf("查找到的元素为%d\n",data);
flag = 1;
break;
}
p = p->next;
i++;
}
if (flag == 1){
printf("查找到的元素在第%d个位置\n",i);
} else{
printf("没找到相关元素\n");
}
return h;
}
//向链表中插入数据
LinkList InsertList(LinkList h){
LinkList p = h->next;
LinkList q;
q = (LinkList)malloc(sizeof(Lnode));//为插入的数据申请一个空间
int data,n;
printf("请输入插入的数据\n");
scanf("%d",&data);
printf("请输入要插入的位置\n");
scanf("%d",&n);
int j = 1;
if (n == 1){
q->next = p->next;
q->data = data;
p->next = q;
return p;
}
while(p!= NULL && n > j+1){
p = p->next;
j++;
}
printf("%d\n",p->data);
if (p ==NULL){
printf("参数错误");
return NULL;
}
q->next = p->next;
q->data = data;
p->next = q;
return h;
}
LinkList Insert_Linklist(LinkList h)
//在有序单链表中插入元素,链表仍然有序
{
LinkList p, q, s;
int x;
printf("请输入要插入的元素:\n");
scanf("%d",&x);
q = h;
p = h->next;
while(p)
{
if(p->data <= x)
{
q = p;
p = p->next;
}
else
break;
}
s = (LinkList)malloc(sizeof(Lnode));
if(!s) return 0;
s->data = x;
q->next = s;
s->next = p;
return h;
}
//插入数据操作2
LinkList InsertList2(LinkList h){
LinkList p = h->next;
LinkList q;
printf("请输入要插入的元素:\n");
int data,n;
scanf("%d",&data);
printf("请输入要插入的元素的位置:\n");
scanf("%d",&n);
if(n == 1){//新节点插入到表头
q = (LinkList)malloc(sizeof(Lnode));//为将要插入的元素申请一个空间
q->data = data;
q->next = p;
h->next = q;
return h;//返回新表头指针
} else{
//查 找第n-1个节点
int i = 1;
int flag = 0;
while(p!= NULL){
if (n == i+1){
flag = 1;
break;
}
p = p->next;
i++;
}
printf("%d\n",p->data);
if (p == NULL){
printf("参数错误\n");
return NULL;
} else {
q = (struct node *)malloc(sizeof(struct node));
q->data = data;
q->next = p->next;
p->next = q;
return h;
}
return h;
}
return h;
}
//删除链表中值为X的数据
LinkList DeleateList(LinkList h){
LinkList p = h->next;
LinkList q = h;
printf("请输入要删除的元素值\n");
int data;
scanf("%d",&data);
while(p != NULL){
if(p->data == data){
q->next = p->next;
free(p);//将p节点释放掉
p = q->next;//p再指向删除元素所指向的元素
}else{
q = p;
p = p->next;
}
}
return h;
}
//删除链表中所有值为偶数的节点
LinkList DelEven_LinkList(LinkList h){
LinkList p, q;
q = h;
p = h->next;
while(p)
{
if(p->data % 2 == 0)
{
q->next = p->next;
free(p);
p = q->next;
}
else
{
q = p;
p = p->next;
}
}
return h;
}
//链表清空
LinkList ClearList(LinkList h){
LinkList p = h->next;
LinkList q;
while(p != NULL){
q = p;
p = p->next;
free(p);
}
h->next = NULL;
return h;
}
//链表逆转
LinkList Reversed(LinkList h){
LinkList q=h->next;
LinkList p=NULL;
LinkList pNext;
while (NULL != q) {
pNext=q->next;
q->next = p;
p=q;
q=pNext;
}
h->next = p;
return h;//返回头指针
}
//计算单链表的长度,并遍历单链表输出单链表表的内容
void printLinkList(struct node *h)
{
LinkList p=h->next;
int i = 0;
while(p!=NULL)
{
printf("%d ", p->data);
p=p->next;
i++;
}
printf("\n");
printf("单链表的长度为:%d\n",i);
}
void menu(){
printf("1:链表创建\n");
printf("2:插入操作\n");
printf("3:删除操作\n");
printf("4:查找操作\n");
printf("5:链表逆转\n");
printf("6:链表清空\n");
printf("7:删除值为偶数的节点\n");
printf("0:退出\n");
}
int main()
{
LinkList head;
int m;
while(1){
menu();
printf("请输入操作的序号:\n");
scanf("%d",&m);
switch (m) {
case 1:
int n;
//struct node *head;
printf("请输入元素的个数:");
scanf("%d", &n);
head=createLinkList(n);//得到头结点
printf("\n单链表创建完毕。。。\n");
printf("\n单链表的元素如下:\n");
printLinkList(head);
break;
case 2:
//向链表中插入数据
//head = InsertList(head);
head = Insert_Linklist(head);//有序插入
printf("插入数据的链表后的结果为:");
printLinkList(head);
break;
case 3:
//链表删除操作
head = DeleateList(head);
printLinkList(head);
break;
case 4:
//查找链表中某个元素并输出其所在位置
FindElem(head);
break;
case 5:
//链表反转
Reversed(head);
printf("反转过后的链表如下:\n");
printLinkList(head);
break;
case 6:
//清空链表
ClearList(head);
printf("链表清空完成:\n");
printLinkList(head);
break;
case 7:
DelEven_LinkList(head);
printLinkList(head);
break;
case 0:
return 0;
break;
default:
break;
}
}
}
数据结构--线性表(单链表C语言实现)
猜你喜欢
转载自blog.csdn.net/karmacode/article/details/80178804
今日推荐
周排行