您的位置:首页 > 其它

单链表基本操作的实现

2018-02-04 21:38 405 查看
#include<stdio.h>
typedef int ElemType;

typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;

//初始化链表,尾插法创建一个单链表
void CreatList(LinkList *L){
int x;
(*L) = (LinkList)malloc(sizeof(LNode));
LNode *s,*r=*L;
scanf("%d",&x);
while(x!=999){
s=(LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d",&x);
}
r->next = NULL;
}

//按序号查找结点值
int GetElem(LinkList L,int i){
int j = 1;
LNode *p=L->next;
if(i < 1)
{
printf("序号出错。");
}
while(p&&j<i){
p = p->next;
j++;
}
printf("序号%d的值为:%d",i,p->data);
}

//按值查找结点
int LocateElem(LinkList L,ElemType e){
int i = 1;
LNode *p=L->next;
while(p!=NULL&&p->data!=e){
p = p->next;
i++;
}
printf("值为%d的序号为:%d",e,i);
}

//指定位置插入元素
int ListInsert(LinkList L,int i,ElemType e){
i--;
int j = 1;
LNode *p = L->next;
if(!p || i<1)
{
printf("序号出错。");
}
while(p&&j<i)
{
p = p->next;
j++;
}
LNode *s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return;
}

//指定位置删除元素
int ListDelete(LinkList L,int i){
i--;
int j = 1;
LNode *p=L->next;
if(i < 1 || !p->next)
{
printf("序号出错。");
}
while(p&&j<i){
p = p->next;
j++;
}
LNode *q = p->next;
p->next = q->next;
free(q);
return 1;
}

//链表打印
int PrintList(LinkList L){
LinkList p = NULL;
p = L->next;
int i = 0;
while(p)
{
printf("%4d",p->data);
p = p->next;
i++;
}
if(i == 0)
{
printf("链表为空。");
}
return 1;
}

//删除链表
int clearList(LinkList L){
LNode *p = L->next;
while(p)
{
LNode *q = p->next;
free(p);
p = q;
}
L->next = NULL;
return 1;
}

int main(){
int i,e;
LinkList list;
printf("请输入建立的链表元素(输入999终止): \n");
CreatList(&list);
PrintList(list);
printf("\n请输入要查询的序号:");
scanf("%d",&i);
GetElem(list,i);
printf("\n请输入要查询的元素值:");
scanf("%d",&e);
LocateElem(list,e);
printf("\n请输入需要插入元素的位置及元素值:");
scanf("%d %d",&i,&e);
ListInsert(list,i,e);
PrintList(list);
printf("\n请输入需要删除元素的位置:");
scanf("%d",&i);
ListDelete(list,i);
PrintList(list);
clearList(list);
return 0;
}
链式存储的引入:
顺序表插入、删除的操作需要移动大量元素,影响运行效率,由此引入线性表的链式存储;链式存储线性表时,不需要使用地址连续的存储单元,即不要求逻辑上相邻的元素在物理存储上也相邻,通过“链”建立起数据元素之间的逻辑关系,因此,对线性表的插入、删除不需要移动元素,只需要修改指针。
单链表:
单链表通过一组任意的存储单元来存储线性表中的数据元素;为了建立数据元素之间的线性关系,对每个链表结点,除了存放元素自身的信息之外,还需要存放一个指向后继的指针。结构特点为 data:数据域 ,存放数据元素 next:指针域,存放其后继结点的地址。

引入头结点:
单链表中,通常用“头指针”标识一个单链表,如单链表L,头指针为“NULL”时表示一个空表;此外,引入头结点(在单链表第一个结点之前附加一个结点),指针域指向线性表的第一个元素结点。
引入头结点的优点:
1.由于开始结点的位置被存放在头结点的指针域中,所以在链表的第一个位置上的操作和表的其他位置上的操作一致,无法进行特殊处理。
2.无论链表是否为空,其头指针是指向头结点的非空指针(空表中头结点的指针域为空),此空表和非空表的处理也就统一了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: