用结构体和指针实现一个单链表的基本操作程序link.c,主要包括以下功能模块:
1.系统菜单模块设计(MenuLine() )。为了在主函数(main())反复执行上图图1单链表子系统的各操作函数,我们在主函数中用循环语句实现此功能,并设计了一个菜单显示各功能选项,用函数MenuLine() 表示
2.单链表的类型定义(typedef struct linknode )。
typedef int DataType; /定义DataType为int类型/
typedef struct linknode /单链表存储类型/
{
DataType data; /定义结点的数据域/
struct linknode *next; /定义结点的指针域/
} LinkList;
3.单链表的初始化(LinkList *InitList())。
LinkList *InitList()
{ /初始化链表函数/
LinkList head;
head=(LinkList)malloc(sizeof(LinkList)); /动态分配一个结点空间/
head->next=NULL;
return head; /头结点L指针域为空,表示空链表/
}
4.显示输出链表函数(void DispList(LinkList *head))。
5.建立链表函数( void CreateList(LinkList *head,int n)),要求建立后显示输出链表。
6.按位置插入元素函数(void InsList(LinkList *head, int i, DataType x)),要求插入后显示输出链表。。
(7)按位置删除链表中元素函数(void DelList(LinkList *head,int i)),要求删除后显示输出链表。
(8)在链表中按位置查找元素(void SearchList(LinkList *head,int i))。
(9)在链表中查找值为x的元素位置(Locate(void LinkList *head,DataType x))。
(10)求链表长度函数(int LengthList(LinkList *head))。
软件:Visual C++ 6.0
如下:
search函数和locate函数你在main函数中调用一下就可以了。
#include <stdio.h>
#include <stdlib.h>
typedef int DataType; /*定义DataType为int类型*/
typedef struct linknode
{
DataType data;
struct linknode * next;
}LinkList;
//创建线性表
LinkList * CreateList()
{
int i,n;
struct linknode * head,*p,*t;
head = (struct linknode *)malloc(sizeof(linknode ));
head->next = NULL;
t = head;
printf("请输入链表的长度:");
scanf("%d",&n);
printf("请输入链表数据:");
for (i=0;i<n;i++)
{
p = (struct linknode *)malloc(sizeof(linknode ));
scanf("%d",&(p->data));
p->next = NULL;
t->next = p;
t = p;
}
return head;
}
int LengthList(LinkList *head)
{
LinkList* p ;
int len = 0;
if (head == 0)
{
return 0;
}
p = head->next;
while (p)
{
len++;
p = p->next;
}
return len;
}
//插入
LinkList * InsList(LinkList *head,int pos,DataType data)
{
struct linknode * p = head,*t;
int i=1;
if(pos <1 || pos > LengthList(head))
{
printf("插入位置错误");
return head;
}
while(i<pos && p)
{
p = p->next;
i++;
}
if (p)
{
t = (struct linknode *)malloc(sizeof(linknode ));
t->data = data;
t->next = p->next;
p->next = t;
printf("插入成功\n");
}else
printf("插入位置不合适,插入失败\n");
return head;
}
//删除
LinkList * DelList(LinkList* head,int pos)
{
int i = 1;
struct linknode * p = head,*t;
if (pos < 0 || pos > LengthList(head))
{
printf("删除位置错误");
return head;
}
while(i<pos && p)
{
p = p->next;
i++;
}
if (p)
{
t = p->next;
p->next = t->next;
free(t);
t = 0;
printf("删除成功\n");
}else
printf("删除成功\n");
return head;
}
//显示
void DispList(LinkList * head)
{
struct linknode * p = head->next;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
//在链表中按位置查找元素
void SearchList(LinkList *head,int pos)
{
LinkList* p;
int i = 1;
if (p<0 || pos > LengthList(head))
{
printf("位置错误");
return;
}
p = head->next;
while (p && i!= pos)
{
p = p->next;
i++;
}
if(p)
{
printf("查找到的数据为:%d\n",p->data);
}else
printf("未找到\n");
}
//查找位置
void Locate(LinkList *head,DataType x)
{
LinkList* p;
int i=1;
if(head == 0)
{
printf("链表为空\n");
return ;
}
p = p->next;
while(p)
{
if (p->data == x)
{
printf("%d所在位置:%d\n",x,i);
return ;
}else
{
i++;
p = p->next;
}
}
printf("未找到该元素\n");
return ;
}
//释放空间
void Free(LinkList * head)
{
struct linknode * p;
while(head)
{
p = head->next;
free(head);
head = p;
}
head = 0;
}
int main()
{
int pos,data;
struct linknode * head = CreateList();
DispList(head);
//插入
printf("请输入插入位置(从1开始)和数据:");
scanf("%d %d",&pos,&data);
head = InsList(head,pos,data);
printf("插入后链表数据:");
DispList(head);
//删除
printf("请输入删除位置(从1开始):");
scanf("%d",&pos);
head = DelList(head,pos);
printf("删除后链表数据:");
DispList(head);
//释放空间
Free(head);
return 0;
}