单链表
其中还有很多bug 一些逻辑没有考虑清楚的 可以自己试试处理
这个主要是我专升本复习过度下的 没怎么用太大精力去弄
希望可以帮助到你
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int ElemType; //假设顺序表中所有元素为int类型
//数据节点
typedef struct node
{
ElemType data;
struct node *next;
} SLink;
//菜单
void cd()
{
printf("*********************************************\n");
printf("请输入以下提示进行操作\n");
printf("0、退出程序\n");
printf("1、初始化链表\n");
printf("2、销毁链表\n");
printf("3、输出链表\n");
printf("4、头插\n");
printf("5、尾插\n");
printf("6、链表的长度\n");
printf("7、查找第i个位置的值\n");
printf("8、按值查找\n");
printf("9、插入到指定位置\n");
printf("10、删除指定的元素\n");
printf("*********************************************\n");
}
//初始化
void InitList(SLink *L)
{
L = (SLink*)malloc(sizeof(SLink));
L = L->next = NULL;
printf("初始化成功");
}
//销毁链表
void DestroyList(SLink *L)
{
SLink *p,*q;
p = L;
while(p)
{
q = p->next;
free(p);
p = q;
}
free(L);
}
//输出链表
void DispList(SLink *L)
{
SLink *p = L;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
//头插法 还要考虑是否带有头结点
void CreateListF(SLink *&L)
{
int data;
printf("请输入要插入的数据\n");
scanf("%d",&data);
SLink *m;
m = (SLink*)malloc(sizeof(SLink));
if(L == NULL)//说明是没有数据
{
L = m;
L->data = data;
L->next = NULL;
}
else{
m->data = data;
m->next = L;
L = m;
}
}
//尾插
void CreateListR(SLink *&L)
{
int data;
printf("请输入要插入的数据\n");
scanf("%d",&data);
SLink *m,*p,*q;
m = (SLink*)malloc(sizeof(SLink));
m->data = data;
m->next = NULL;
p=L;
if(p == NULL)
{
L = m;
}
else{
while(p)
{
q = p;
p = p->next;
}
q->next = m;
}
}
//链表的长度
void GetLength(SLink *L)
{
int i = 0;
SLink *p = L;
while(p)
{
i++;
p = p->next;
}
printf("链表的长度为:%d\n",i);
}
//查找链表中第i个位置的值
void GetElem(SLink *L)
{
int n,i=0;
printf("请输入你要查找第几个位置的值\n");
scanf("%d",&n);
SLink *p = L;
if(n <= 0) return ;
while(p != NULL && --n>0)
{
p = p->next;
}
if (p == NULL){
printf("没有找到\n");
}else{
printf("%d\n",p->data);
}
}
//按值查找 看值存不存在 还有一个是按值查找位置 第几个 这里就不写了 差不多
void Locate(SLink *L)
{
int n;
printf("请输入你要查找的值\n");
scanf("%d",&n);
SLink *p = L;
while(p)
{
if(n==p->data)
{
printf("值存在\n");
return;
}
p = p->next;
}
if(p == NULL)
printf("值不存在\n");
}
//插入 到指定位置
void InsElem(SLink *L)
{
int i , data;
printf("请输入你要插入的位置\n");
scanf("%d",&i);
printf("请输入你要插入的值\n");
scanf("%d",&data);
SLink *p = L,*m;
m = (SLink*)malloc(sizeof(SLink));
m->data = data;
while(p && --i>0)
{
p = p->next;
}
m->next = p->next;
p->next = m;
}
//删除 第 i个位置
void DelElem(SLink *L)
{
int i , data;
printf("请输入你要删除的位置\n");
scanf("%d",&i);
SLink *p = L,*q;
//这里有一个坑 不能删除头节点不然会 bug
while(p && --i>0)
{
q = p;
p = p->next;
}
q->next = p->next;
free(p);
}
int main()
{
int n;
SLink *p;
while(1)
{
cd();
printf("请输入指令\n");
scanf("%d",&n);
switch(n)
{
case 0: return 0; break;
case 1: InitList(p); break;
case 2: DestroyList(p); break;
case 3: DispList(p); break;
case 4: CreateListF(p); break;
case 5: CreateListR(p); break;
case 6: GetLength(p); break;
case 7: GetElem(p); break;
case 8: Locate(p); break;
case 9: InsElem(p); break;
case 10: DelElem(p); break;
}
}
}