代码经过反复修改,自认为已经很严谨了
如果代码运行不够严谨或运行有误,欢迎指出
每个人写代码的思路都会不一样,所以我的代码只做参考
//单链表的实现
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node *next;
}LNode,*LinkList;
LinkList CreateLink(int n);
void OutputLink(LinkList L);
int InsertNode(LinkList &L,int i,ElemType e);
int DeleteNode(LinkList &L,int i);
int GetElem(LinkList L, int i);
void OppLink(LinkList &L);
int main()
{
LinkList L;
int n,num,i,a,e=0;
printf("请输入链表的长度:");
scanf("%d",&n);
L = CreateLink(n);
printf("当前单链表为:\n");
OutputLink(L);
again:
printf("\n");
printf("* * * * * * * * * * * * * * *请输入当前要进行的操作* * * * * * * * * * * * * * *\n");
printf(" 1. 插入结点 \n");
printf(" 2. 删除结点 \n");
printf(" 3. 查找结点 \n");
printf(" 4. 输出链表 \n");
printf(" 5. 逆置链表 \n");
printf(" 6. 退出程序 \n");
printf("* * * * * * * * * * * * * * *请输入当前要进行的操作* * * * * * * * * * * * * * *\n");
scanf("%d",&num);
if(num==1)
{
printf("请输入要插入的位置和数据:");
scanf("%d %d",&i,&a);
InsertNode(L,i,a);
goto again;
}
else if(num==2)
{
printf("请输入要删除的位置:");
scanf("%d",&i);
DeleteNode(L,i);
goto again;
}
else if(num==3)
{
printf("请输入要查找的位置:");
scanf("%d",&i);
GetElem(L,i);
goto again;
}
else if(num==4)
{
printf("当前的单链表为:\n");
OutputLink(L);
goto again;
}
else if(num==5)
{
OppLink(L);
printf("逆置成功!\n");
goto again;
}
else if(num==6)
{
printf("程序已退出!") ;
}
else
printf("输入有误,请再次输入!\n");
}
//创建单链表
LinkList CreateLink(int n)
{
LinkList L = NULL;
LNode *p,*q;
int i;
L = (LinkList)malloc(sizeof(LNode));
if(!L) exit(OVERFLOW);
L->next = NULL;
q = L;
for(i = 0;i<n;i++)
{
p = (LinkList)malloc(sizeof(LNode));
if(!p)
{
printf("创建失败!\n");
exit(OVERFLOW);
}
printf("请输入第%d个数据:",i+1);
scanf("%d",&p->data);
p->next = NULL;
q->next = p;
q = p;
}
return L;
}
//输出单链表
void OutputLink(LinkList L)
{
LNode *p = L;
while(p->next)
{
p = p->next;
printf("%d ",p->data);
}
printf("\n");
}
//插入结点
int InsertNode(LinkList &L, int i, ElemType e)
{
int j = 0;
LNode *p = L, *s;
while (p && j < i - 1)
{
p = p->next;
++j;
}
if (!p || j > i - 1)
{
printf("插入位置不正确!\n");
return ERROR;
}
s = (LinkList)malloc(sizeof(LNode));
if(!s)
{
printf("插入失败!\n");
exit(OVERFLOW);
}
s->data = e;
s->next = p->next;
p->next = s;
printf("插入成功!\n");
return OK;
}
//删除结点
int DeleteNode(LinkList &L, int i)
{
int j = 0;
ElemType e;
LNode *p = L, *q;
while (p->next && j < i - 1)
{
p = p->next;
++j;
}
if (!(p->next) || j > i - 1)
{
printf("删除位置有误!\n");
return ERROR;
}
q = p->next;
e = q->data;
p->next = q->next;
free(q);
printf("删除成功!删除的值为:%d\n",e);
return OK;
}
//查找结点
int GetElem(LinkList L, int i)
{
ElemType e;
LNode *p = L->next;
int j = 1;
while(p && j<i)
{
p = p->next;
++j;
}
if(!p || j>i)
{
printf("查找位置有误!");
return ERROR;
}
e = p->data;
printf("查找成功!查找的数据为:%d\n",e);
return OK;
}
//逆置单链表
void OppLink(LinkList &L)
{
LinkList p,q,s;
p = L->next;
q = p->next;
s = q->next;
p->next = NULL;
while(s->next)
{
q->next = p;
p = q;
q = s;
s = s->next;
}
q->next = p;
s->next = q;
L->next = s;
}