数据结构单链表的基本操作实现:
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
//定义节点的结构
typedef struct Node{
int data; //数据域
struct Node * next;
}Node,*pNode;
//创建头结点
pNode InitList(){
//这样创建节点函数执行完会释放 Node L;
pNode L=(pNode)malloc(sizeof(Node));
L->next=NULL;
return L;
}
//创建新节点
pNode create_node (int a){
pNode node=(pNode)malloc(sizeof(Node));
node->data=a;
node->next=NULL;
return node;
}
//查询链表长度
int length(pNode l){
int i=0;
pNode p=l->next;
while(p!=NULL){
p=p->next;
i++;
}
return i;
}
//查找第i个元素
void find(pNode l){
int a,j=0;
printf("请输入所要查询元素在链表中的序号");
scanf("%d",&a);
pNode p=l;
while(p->next!=NULL&&j<a){//3.判断 p所指向的下一个节点是否为空或者是否已经指向第i个节点
p=p->next;//1.p指向第一个data
j++;//2.j=1;
}
if(!p||j>a){//如果p指向空或者a的位置不合理(a<1或a>length(l)
printf("该链表无第i个元素\n");
}
printf("第%d个元素是%d\n",a,p->data);
}
//尾插
void push_back(pNode l){
int a,j;
printf("请输入要插入的值\n");
scanf("%d",&a);
pNode p=create_node(a); //用p指针指向新生成的节点
pNode q=l;
j=length(l);
for(int i=1;i<=j;i++){
q=q->next;//使指针q指向链表的最后一个元素
}
q->next=p;
}
//头插
void push_front(pNode l){
int a;
printf("请输入你要插入的元素");
scanf("%d",&a);
pNode p=create_node(a);
p->next=l->next;
l->next=p;
}
//在i处插入节点
void insert_val(pNode l){
int a,j=1,b;
pNode p,q;
printf("请输入插入链表的位置\n");
scanf("%d",&b);
printf("请输入插入节点的内容");
scanf("%d",&a);
q=create_node (a);
p=l;
while(p->next!=NULL&&j<b){//j最初赋值为1,所以p指向第i个元素的前一项,当插入位置为1时不会执行该循环
p=p->next;
j++;
}
q->next=p->next;
p->next=q;
}
//删除第i个位置的元素 (两种方法)
//第一种:p指向i,q指向i+1,将q拷贝给p,释放q。
//第二种:p指向i的前驱删除元素
void delete_val(pNode l){
int j=1,a;
pNode p,q;
p=l;
printf("请输入所要删除元素的位置");
scanf("%d",&a);
while(p->next!=NULL&&j<a){
p=p->next;
j++;
}
q=p->next;
p->next=q->next;
free(q);
}
//打印链表中的数据
void show_list (pNode p){
pNode a;
a=p->next;
printf("链表为:");
while(a!=NULL){
printf("%d ",a->data);
a=a->next;
}
printf("\n");
}
//把链表从小到大排序
void sort(pNode l){
pNode p,q;
int k;
p=l->next;
while(p!=NULL){
q=p->next;
while(q!=NULL){
if(p->data>q->data){
k=p->data;
p->data=q->data;
q->data=k;
}
q=q->next;
}
p=p->next;
}
}
//把链表逆序
void resver(pNode l){
pNode s,p,q;
s->next=NULL;
p=l->next;
while(p!=NULL){
q=p->next;
p->next=s->next;
s->next=p;
p=q;
}
l->next=s->next;
}
//清除单链表
void clear(pNode l){
pNode p=l->next,q;
while(p!=NULL){
q=p->next;
free(p);
p=q;
}
l->next=NULL;//注意这里要让l指向空,不然就指向一块被释放的空间
}
//销毁单链表
void destroy (pNode l){
pNode p=l->next,q;
while(p!=NULL){
q=p->next;
free(p);
p=q;
}
free(l);
}
int main(){
int a,k;
pNode L;
while(1){
printf("**************************************\n");
printf("* [1]创建头结点 [2] 尾插法插入 *\n");
printf("* [3]查询链表长度 [4]头插法插入 *\n");
printf("* [5]查找第i个元素 [6]在第i处插入 *\n");
printf("* [7]删除第i个元素 [8]从小到大排序 *\n");
printf("* [9]逆置 [10]清除单链表 *\n");
printf("* [11]销毁单链表 [12]clear *\n");
printf("* [13*]打印链表 [0] 退出 *\n");
printf("**************************************\n");
printf("请输入你的选择\n");
scanf("%d",&a);
if(a==0){
break;
}
switch(a){
case 1:L=InitList();break;
case 2:push_back(L);break;
case 3:k=length(L);printf("链表长度为%d\n",k);break;
case 4:push_front(L);break;
case 5: find(L);break;
case 6:insert_val(L);break;
case 7:delete_val(L);break;
case 8:sort(L);break;
case 9:resver(L);break;
case 10: clear(L);break;
case 11:destroy(L);break;
case 12:break;
case 13: show_list(L);break;
}
}
return 0;
}
若有不足或建议欢迎评论区指出。