#include <stdio.h>//链表操作集****************
#include <stdlib.h>
typedef int Elemtype;
typedef struct node
{
Elemtype data;
struct node* next;
}LNode,*LinkList;
void menu()
{
printf("*************************************************************\n");
printf("**************1.push_back 2.push_front******\n");
printf("**************3.pop_front 4.pop_back*********\n");
printf("**************5.find_val 6.sort*************\n");
printf("**************7.reverse 8.size***********\n");
printf("**************9.delete_position 10.insert***********\n");
printf("**************11.hebin 12.cls**************\n");
printf("**************13.exit 14.destroy*************\n");
printf("**************15.show 16.find_position**********************************\n");
printf("**************17.delete_val*****************18.sort_insert*****************\n");
printf("**************************************************\n");
}
LinkList create()
{
LinkList head=(LinkList)malloc(sizeof(struct node));
if(head==NULL)
exit(0);
head->next=NULL;
return head;
}
void push_back(LinkList L,int input)
{
LinkList pnew=L;
while(pnew->next!=NULL)
{
pnew=pnew->next;
}
LinkList newnode=(LinkList)malloc(sizeof(struct node));
newnode->data=input;
newnode->next=NULL;
pnew->next=newnode;
}
void show(LinkList L)
{
if(L->next==NULL)
return;
LinkList p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void push_front(LinkList L,int input)
{
LinkList newnode=(LinkList)malloc(sizeof(struct node));
newnode->data=input;
newnode->next=L->next;
L->next=newnode;
}
void pop_front(LinkList L,int *e)
{
if(L->next==NULL)
return;
LinkList p=L->next;
*e=p->data;
L->next=p->next;
free(p);
p=NULL;
}
void pop_back(LinkList L,int *e)
{
if(L->next==NULL)
return;
LinkList p=L;
while(p->next->next!=NULL)
{
p=p->next;//找到倒数第二个结点
}
*e=p->next->data;//获取最后一个结点的值
free(p->next);//释放最后一个结点
p->next=NULL;//把倒数第二个结点的指针置为空
}
void find_val(LinkList L,int input,int *position)
{
int count=0;
if(L->next==NULL)
return;
LinkList p=L;
while(p->next!=NULL)
{
count++;
p=p->next;
if(p->data==input)
{
*position=count;
}
}
}
void find_position(LinkList L,int position,int* e)
{
if(L->next==NULL)
return;
LinkList p=L->next;
int count=0;
while(p!=NULL)
{
count++;
p=p->next;
}
if(position<=0||position>count)
{
printf("查找位置不存在\n");
exit(-1);
}
p=L->next;
count=0;
p=L->next;
while(p!=NULL)
{
count++;
if(count==position)
{
*e=p->data;
return;
}
p=p->next;
}
}
void sort(LinkList L)
{
int len=0;
if(L==NULL)
{
return;
}
LinkList p=L->next;
while(p!=NULL)
{
len++;
p=p->next;
}
int i,j;
for(i=0;i<len-1;++i)
{
p = L->next; // 保存链表头
for(j=0;j<len-i-1;++j)
{
if(p->data > p->next->data) // 交换相邻元素的位置
{
int temp=p->data;
p->data=p->next->data;
p->next->data=temp;
}
p = p->next;
}
}
}
//void reverse(LinkList L)
void destroy(LinkList L)
{
if(L==NULL)
return;
LinkList p=L->next;
while(p!=NULL)
{
LinkList temp=p->next;
free(p);
p=temp;
}
free(L);
}
void delete_position(LinkList L,int position,int *e)
{
int count=0;
if(L==NULL)
return;
LinkList p=L->next;
while(p!=NULL)
{
count++;
p=p->next;
}
if(position<=0||position>count)
{
printf("位置错误\n");
exit(-1);
}
count=0;
p=L->next;
while(p!=NULL)
{
count++;
if(position==count)
{
break;
}
p=p->next;
}
if(p->next==NULL)
{
return;
}
LinkList S;
S=p->next;
p->next=S->next;
*e=S->data;
free(S);
}
/*void delete_val(LinkList L,int input,int *position)
{
if(L==NULL)
return;
LinkList node=NULL;
int count=0;
LinkList p=L->next;
while(p!=NULL)
{
count++;
if(p->next->data==input)
{
node=p->next;
break;
}
p=p->next;
}
if(node==NULL)
{
printf("NOT FOUND\n");
exit(-1);
}
p->next=node->next;
*position=count;
free(node);
node=NULL;
}*/
void delete_val(LinkList L, int input, int *position) {
if (L == NULL)
return;
int count = 0;
LinkList prev = NULL, p = L->next;
while (p != NULL) {
count++;
if (p->data == input) { // 找到要删除的节点
break;
}
prev = p;
p = p->next;
}
if (p == NULL) {
printf("NOT FOUND\n");
exit(-1);
}
if (prev == NULL) { // 如果要删除的是第一个节点
L->next = p->next;
} else {
prev->next = p->next; // 正常情况下的删除操作
}
*position = count; // 返回节点位置
free(p);
p=NULL;
}
void size(LinkList L)
{
int count = 0;
if(L->next==NULL)
return;
LinkList p=L->next;
while(p!=NULL)
{
count++;
p=p->next;
}
printf("%d\n",count);
}
void insert(LinkList L,int input,int position)
{
int count=0;
if(L==NULL)
return;
LinkList p=L->next;
while(p!=NULL)
{
count++;
p=p->next;
}
if(position<=0||position>count)
{
printf("插入位置错误\n");
exit(-1);
}
count=0;
p=L->next;
while(p!=NULL)
{
count++;
if(position==count)
{
break;
}
p=p->next;
}
if(p->next==NULL)
{
printf("NOT FOUND\n");
exit(-1);
}
LinkList node=(LinkList)malloc(sizeof(struct node));
node->data=input;
node->next=p->next;
p->next=node;
}
//void sort_insert(LinkList L, int input)
//{
// LinkList p, q;
// q = L;
// p = L->next;
// LinkList newnode = (LinkList)malloc(sizeof(struct node));
// newnode->data = input;
// newnode->next = NULL;
// while (p != NULL)
// {
// if (p->data >= input)
// {
// newnode->next = p;
// q->next = newnode;
// return;
// }
// q = p;
// p = p->next;
// }
// q->next = newnode; //遍历完整个链表,将新结点插入到链表尾部
//}
void sort_insert(LinkList L,int input)
{
if(L==NULL)
return;
LinkList p,q;
p=L->next;
q=L;
LinkList newnode=(LinkList)malloc(sizeof(struct node));
newnode->data=input;
newnode->next=NULL;
while(p!=NULL)
{
if(p->data<input)
{
q=p;
p=p->next;
}
else
{
newnode->next=p;
q->next=newnode;
return;
}
}
q->next=newnode;
return;
}
void reverse(LinkList L)
{
if(L==NULL)
return;
LinkList prev=NULL;
LinkList curr=L->next;
while(curr!=NULL)
{
L->next=curr;
curr=curr->next;
L->next->next=prev;
prev=L->next;
}
}
int main()
{
menu();
LinkList L;
L=create();
int choice;
int input;
while(1)
{
printf("请选择:\n");
scanf("%d",&choice);
int e;
int position;
switch(choice)
{
case 1:
printf("请输入要尾插入的元素,当插入-1时插入结束:\n");
while(scanf("%d",&input),input!=-1)
{
push_back(L,input);
}
break;
case 2:
printf("请输入要头插入的元素,如果插入-1就结束:\n");
while(scanf("%d",&input),input!=-1)
{
push_front(L,input);
}
break;
case 3:
printf("头删:\n");
pop_front(L,&e);
printf("删除的元素是:%d\n",e);
break;
case 4:
printf("尾删:\n");
pop_back(L,&e);
printf("尾删的元素是:%d\n",e);
break;
case 5:
printf("按元素查找,请输入要查找的元素:\n");
scanf("%d",&input);
find_val(L,input,&position);
printf("找到了该元素%d 的结点序号是:%d\n",input,position);
break;
case 6:
printf("升序:\n");
sort(L);
break;
case 7:
printf("链表的翻转:\n");
reverse(L);
break;
case 8:
printf("长度:\n");
size(L);
break;
case 9:
printf("链表按照结点删除,请输入要删除的结点:\n");
scanf("%d",&position);
delete_position(L,position,&e);
printf("删除结点%d的元素是%d\n",position,e);
break;
case 10:
printf("请输入要插入的元素和位置:\n");
scanf("%d%d",&input,&position);
insert( L, input, position);
break;
case 11:
break;
case 12:
system("cls");
menu();
break;
case 13:
printf("退出成功\n");
exit(-1);
break;
case 14:
destroy(L);
break;
case 15:
printf("数据展示:\n");
show(L);
break;
case 16:
printf("按结点查找,请输入要查找的结点:\n");
scanf("%d",&position);
find_position(L,position,&e);
printf("找到了该结点的元素是%d\n",e);
break;
case 17:
printf("按照元素删除结点,请输入要删除的元素:\n");
scanf("%d",&input);
delete_val(L,input,&position);
printf("删除元素%d的结点是%d\n",input,position);
break;
case 18:
printf("请输入要插入的元素:\n");
scanf("%d",&input);
sort_insert(L,input);//意思是在有序链表中插入一个元素,链表仍然有序
break;
}
}
return 0;
}
C语言(数据结构)单链表的增删改查
于 2024-03-03 16:51:09 首次发布
本文详细介绍了如何使用C语言实现链表的创建、基本操作(如push_back、push_front、sort、reverse、size等)、删除节点以及查找功能。
摘要由CSDN通过智能技术生成