#include<stdlib.h>
#include<stdio.h>
typedef struct LNode
{
int data;
struct LNode *next;
}*LinkedList,LNode;
LinkedList LinkedListInit() //初始化单链表
{
LNode *head;
head=(LNode*)malloc(sizeof(LNode));
return head;
}
LinkedList LinkedListCreat() //用尾插法建立单链表
{
int len;
int i;
int val;
// 分配了一个不存放有效数据的头节点
LinkedList head=(LNode*)malloc(sizeof(LNode));
if(NULL==head)
{
printf(" 分配失败,程序终止! n");
exit(-1);
}
LinkedList pTail=head;
LinkedList pNew;
pTail->next=NULL;
printf(" 请输入您需要生成的链表结点的个数: ");
scanf("%d",&len);
printf("n");
for (i=0;i<len;i++)
{
printf(" 请输入第 %d 个结点的值 : ",i+1);
scanf("%d",&val);
printf("n");
pNew=(LNode*)malloc(sizeof(LNode));
if(NULL==pNew)
{
printf(" 分配失败,程序终止! n");
exit(-1);
}
pNew->data=val;
pTail->next=pNew;
pTail=pNew;
}
pNew->next = NULL;
return head;
}
void LinkedListTraverse(LinkedList L){ //1 遍历单链表
while(L!=NULL)
{
L=L->next;
printf("n");
printf("%dn", L->data);
}
}
void LinkedListClear(LinkedList L) //2 清空单链表
{
struct LNode *node;
while(L->next!=NULL)
{
node = L;
free(node);
L = L->next;
}
free(L);
}
int LinkedListEmpty(LinkedList L) //3 检查单链表是否为空
{
if(L->next==NULL)
{
printf("n");
printf("单链表为空");
}
else
{
printf("n");
printf("单链表不为空");
}
}
int LinkedListLength(LinkedList L) //4 求单链表的长度
{
LinkedList p = L->next;
int len = 0;
while(NULL!=p)
{
len++;
p = p->next;
}
printf("n");
printf("单链表的长度为 :%dn",len);
return len;
}
LinkedList LinkedListGet(LinkedList L, int i) //5 从单链表中查找元素
{
LinkedList p = L->next;
if(L->next==NULL)
printf("该链表为空n");
int j = 1;
while(p&&j<i)
{
p = p->next;
i++;
}
if(!p||j>i)
exit(-1);
printf("n");
printf("数据的值为%dn",p->data);
}
void LinkedListInsert(LinkedList L, int i, int x) //6 向单链表中插入元素
{
LinkedList p = L;
if(L->next==NULL)
printf("该链表为空n");
int j = 0;
while(p&&j<i-1)
{
p = p->next;
j++;
}
if(!p||j>i-1)
exit(-1);
LinkedList s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = p->next;
p->next = s;
while(L!=NULL)
{
L=L->next;
printf("n");
printf("%dn", L->data);
}
}
void LinkedListDel(LinkedList L, int i) //7 从单链表中删除元素
{
LinkedList p = L;
if(L->next==NULL)
printf("该链表为空n");
int j = 0;
while(p&&j<i-1)
{
p = p->next;
j++;
}
if(!p||j>i-1)
exit(-1);
p->next = p->next->next;
while(L!=NULL)
{
L=L->next;
printf("n");
printf("%dn", L->data);
}
}
int LinkedListLocate(LinkedList L, int x) //8 从单链表中按值查找与给定值相同的元素在链表中的位置
{
LinkedList p = L->next;
int i = 0;
if(L->next==NULL)
printf("该链表为空n");
while (p && p->data != x)
{
p = p->next;
i++;
}
if (p && p->data == x){
i++;
printf(":%d",i);
}
else
{
printf("n");
printf("你所要查找的数据不存在!");
}
}
int main()
{
LinkedListInit();
LinkedList L = LinkedListCreat();
int i, x;
printf("1:遍历单链表 2:清空单链表 3:检查单链表是否为空 4:检查单链表的长度 5:查找元素 6:插入元素 7: 删除元素 8:查找与给定值相同的元素n");
printf("n");
printf("输入想要的功能 : ");
scanf("%d",&i);
switch(i){
case 1:{
LinkedListTraverse(L);
break;
}
case 2: {
LinkedListClear(L);
break;
}
case 3:{
LinkedListEmpty(L);
break;
}
case 4:{
LinkedListLength(L);
break;
}
case 5: {
printf("n");
printf("请输入要查找第几个元素的数据 : ");
scanf("%d",&i);
LinkedListGet(L, i);
break;
}
case 6: {
printf("n");
printf("请输入在第几个结点之前插入数据 : ");
scanf("%d",&i);
printf("n");
printf("插入的数据的值为 : ");
scanf("%d",&x);
LinkedListInsert(L, i, x);
break;
}
case 7: {
printf("n");
printf("请输入想要删除第几个结点的数据 : ");
scanf("%d",&i);
LinkedListDel(L, i);
break;
}
case 8: {
printf("n");
printf("请输入想要查找元素的数据 : ");
scanf("%d",&x);
LinkedListLocate(L,x);
break;
}
return 0;
}
}
有没有大佬知道怎么运行一次后,不用重新运行就可以重复进行功能