建立单链表,完成链表(带表头结点)的基本操作:建立链表、插入、删除、查找、输出;其它基本操作还有销毁链表、将链表置为空表、求链表的长度、获取某位置结点的内容、搜索结点。
1.设计的思路:
(1)定义单链表。
(3)建立单链表。
(4)在链表的第i个位置插入值为x的结点。
(5)删除链表的第i个结点。
(6)输出单链表。
2.程序源码
#include "stdafx.h"
#include "stdio.h"//标准输入输出头文件
#include "stdlib.h"//系统函数
#include "malloc.h"//动态存储函数头文件
#define error 0
#define ok 1
typedef int Elemtype;
typedef int Status;
typedef struct Node//定义单链表
{
Elemtype data;//定义数据域
struct Node *next;
}Node,*LinkList;
LinkList create(int m)//建立单链表
{
LinkList L;//定义结构指针
Node *p1,*p2;//定义结点
int i,data;
L=(Node *)malloc(sizeof(struct Node));//动态分配内存空间
p2=L;//将L的首地址赋值给p2
printf("请输入链表的结点:/n");
for(i=0;i<m;i++)
{
scanf("%d",&data);
p1=(Node *)malloc(sizeof(struct Node));//动态分配内存空间p1为移动的指针
p1->data=data;//赋值给data
p2->next=p1;//指定头指针p2的下一个结点为p1
p2=p1;//p2从头指针移动到p1
}
p2->next=NULL;//最后一个结点的指针域
return L;
}
Status ListFind(LinkList L,int e)//在表中查找第e个元素 找到则返回该结点的指针 否则返回error
{
LinkList p;
int i=0;
p=L->next;//初始化的时候指针指向第一个元素 i为计数器
while(p&&i<e)
{
p=p->next;
i++;
}
if(p&&i==e)
return p->data;//存在第e个元素 返回第e个元素
return error;
}
Status ListInsert(LinkList &L,int i,Elemtype e)//在单链表的第i个位置之前插入值为e的结点
{
int j=0;
Node *p,*s;
p=L;//L的首地址赋给p
while(p&&j<i-1)//寻找第i-1个结点
{
p=p->next;//指针后移
++j;
}
if(!p||j>i-1)
return error;
s=(LinkList)malloc(sizeof (struct Node));//生成新结点
s->data=e;//插入操作
s->next=p->next;
p->next=s;
return ok;
}
Status ListDelete(LinkList &L,int i,Elemtype &e)//删除单链表第i个元素
{
int j=0;
Node *p,*q;
p=L;
while(p->next&&j<i-1)//寻找第i个结点,并令p指向其前依个结点
{
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;
}
void printf(LinkList L)//输出单链表
{
Node *p;//声明结构指针
p=L->next;//头指针的第一个结点
printf("单链表的顺序为:");
while(p!=NULL)
{
printf("%d",p->data);
}
p=p->next;
}
void menu() //菜单函数
{
printf("*************单链表**************/n");
printf("1.建立单链表/n");
printf("2.查找结点位置的元素/n");
printf("3.插入新的元素/n");
printf("4.删除元素/n");
printf("5.输出单链表/n");
printf("6.退出/n");
printf("*********************************/n");
}
int main()
{
LinkList L;
int c,n,i,e,k;//c为判断的标识符,n为查找结点的位置,i为插入元素或删除元素的位置,e为插入元素,k为链表的长度
menu();
while(1)
{
printf("/n请输入选项:");
scanf("%d",&c);
switch(c)
{
case 1:printf("请输入链表的长度:");
scanf("%d",&k);
L=create(k);
break;
case 2:printf("请输入要查找的结点元素:");
scanf("%d",&n);
ListFind(L,n);
break;
case 3:printf("请输入插入元素的位置:");//在单链表L中第i个位置之前插入新的元素e
scanf("%d",&i);
printf("请输入插入元素:");
scanf("%d",&e);
ListInsert(L,i,e);
break;
case 4:printf("请输入删除的元素位置:");//在单链表L中删除第i个元素的,并用e返回其值
scanf("%d",&i);
ListDelete(L,i,e);
break;
case 5:printf("单链表的顺序为:");printf(L);break;//输出单链表的元素
case 6:exit(error);//退出系统
}
}
system("pause");
return 0;
}