C语言实现单链表
用C语言实现单链表的基本操作
1 、初始化单链表
2 、 销毁单链表
3 、 头插法建立单链表
4 、 尾插法建立单链表
5 、 输出单链表内容
6 、 按位置取值
7 、 插入数据元素
8 、删除数据元素
完整代码展示
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 10
#define LIST_INCREMENT 2
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASINLE -1
#define OVERFLOW -2
typedef int Status;
typedef char ElemType;
typedef struct LNode
{
ElemType data; //数据域
struct LNode *next;//指针域
}LNode, *LinkList; //一般定义结点
Status InitList(LinkList &L)
{
L=(LinkList) malloc(sizeof(LNode));
if(!L)
exit(OVERFLOW);
L->next=NULL;
return OK;
}//InitList
void DestroyList(LinkList &L)
{
LinkList p;
p=L->next;
while(p)
{
L->next=p->next;
free(p);
p=L->next;
}
free(L);
}//DestroyList
void CreateListHead(LinkList &L,int n)
{
int i;
LinkList p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%c",&p->data);
p->next=L->next;
L->next=p;
}
}//CreateListHead
void CreateListTail(LinkList &L,int n)
{
int i;
LinkList p,r;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
r=L;
for(i=0;i<n;++i)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%c",&p->data);
p->next=NULL;
r->next=p;
r=p;
}
}//CreateListTail
void PrintList(LinkList &L)
{
if(L==NULL)
{
printf("The List Is NULL!");
return;
}
while(L!=NULL)
{
L=L->next;
while(L)
{
printf("%c",L->data);
L=L->next;
}
printf("\n");
}
}//PrintList
Status GetElem(LinkList L,int i,ElemType &e)
{
LinkList p;
int j;
p=L->next;
j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}//GetElem
Status LinkInsert(LinkList &L,int i,ElemType e)
{
LinkList p,s;
int j;
p=L;
j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
s=(LinkList) malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}//LinkInsert
Status ListDelete(LinkList &L,int i,ElemType &e)
{
LinkList p,q;
int j;
p=L;
j=0;
while(p->next&&j<i-1)
{
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
}//ListDelete
void menu()
{
printf("----------单链表的定义和基本操作----------\n");
printf("- 1 初始化单链表 -\n");
printf("- 2 销毁单链表 -\n");
printf("- 3 头插法建立单链表 -\n");
printf("- 4 尾插法建立单链表 -\n");
printf("- 5 输出单链表内容 -\n");
printf("- 6 按位置取值 -\n");
printf("- 7 插入数据元素 -\n");
printf("- 8 删除数据元素 -\n");
printf("- 0 退出 -\n");
printf("请输入菜单对应的数字:");
}
int main()
{
LinkList L;
int i,k;
ElemType c;
for(;;)
{
menu(); //调用菜单函数
scanf("%d",&k);
switch(k)
{
case 1: InitList(L); //构造一个空单链表L
printf("初始化单链表L \n");
system("pause"); //系统函数,暂停界面,显示结果,按任意键继续
system("cls"); //系统函数,清除屏幕上的运行结果和上一次输出的菜单
break;
case 2:DestroyList(L); //销毁单链表L
printf("单链表L已销毁 \n");
system("pause");
system("cls");
break;
case 3: printf("头插法建立单链表L:\n");
printf("请输入数据元素的个数:");
scanf("%d",&i);
getchar();
CreateListHead(L,i); //头插法建立单链表L
system("pause");
system("cls");
break;
case 4: printf("尾插法建立单链表L:\n");
printf("请输入数据元素的个数:");
scanf("%d",&i);
getchar();
CreateListTail(L,i); //尾插法建立单链表L
system("pause");
system("cls");
break;
case 5: printf("输出单链表L:");
PrintList(L); //遍历输出单链表L
printf("\n");
system("pause");
system("cls");
break;
case 6: printf("请输入查找位置:");
scanf("%d",&i);
if(GetElem(L,i,c)) //根据所给位置查询数据
printf("%d位置上的数据是%c\n。",i,c);
else
printf("没有找到,请核实查找位置是否正确。\n");
system("pause");
system("cls");
break;
case 7: printf("请输入要插入的数据:");
getchar();
scanf("%c",&c);
printf("请输入要插入的位置:");
scanf("%d",&i);
if(LinkInsert(L,i,c)) //根据所给位置插入数据
printf("插入成功!\n");
else
printf("插入失败。请核实插入位置。\n");
system("pause");
system("cls");
break;
case 8: printf("请输入要删除的数据位置:");
scanf("%d",&i);
if(ListDelete(L,i,c)) //根据所给位置删除数据
printf("删除成功!你删除的数据是:%c\n",c);
else
printf("删除失败。请核实插入位置。\n");
system("pause");
system("cls");
break;
case 0:return 0;
}
}
}
运行截图
结语
不知不觉在C社和大家呆了一年了,看到了很多很棒的项目和知识点的总结拓展。当然了,也有许多有趣的程序员小笑话awa。希望以后能和大家更多的互动与交流。共同成为优秀的程序员!