单链表的基本操作
来源:互联网 发布:三维设计软件 编辑:程序博客网 时间:2024/06/08 06:38
单链表样式样式: 头指针--->头结点---->a1---> ... --->an
头指针:
指的是链表指向第一个结点的指针,若链表有头结点,那么就会指向这个头结点。一般头指针会被冠以链表的名字,做标识作用。头指针必须存在
头结点:
放在第一个元素的结点之前,数据域一般没有意义,有时候可能用来存放链表的长度。有它是为了将头结点的操作和其它节点统一起来。头结点非必须。
单链表:若指向第i个元素,那么这个结点的数据域是i->data,指针域是i->next,i->next指向下一个元素。
#include<stdio.h>
typedef int ElemType;typedef int Status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList &L){
L = new LNode;
L->next = NULL;
}
Status GetElem(LinkList L,int i,ElemType e){
//按位检索链表的值
LNode *p=L->next;
int j=1;
while(p&&i>j){
p = p->next;
++j;
}
e= p->data;
return e;
}
int GetCode(LinkList &L,ElemType e){
//按值查找第一位值为e的下标
LNode *p=L->next;
int i=0;
while(p->data!=e){
p=p->next;
i++;
if(p==NULL) return -1;
}
return i+1;
}
void CreateList_H(LinkList &L,int n){
//头插法创建单链表
int i,a;
for(i=0;i<n;i++){
scanf("%d",&a);
LNode *p = new LNode;
p->data=a;
p->next = L->next;
L->next = p;
}
}
void CreateList_R(LinkList &L,int n){
//尾插法创建单链表
int a;
LNode *r=L,*p;
while(n){
scanf("%d",&a);
p=new LNode;
p->data=a;
p->next= NULL;
r->next=p;
r=p;
n--;
}
}
void ListDel(LinkList &L,ElemType e){
//删除元素值为e的结点
LNode *p=new LNode,*q=new LNode;
p=L;
int i=GetCode(L,e)-1;
if(i==-2) printf("链表中不存在该值!\n");
else{
if(i==0){
L=p->next;
delete p;
}
else{
int j=0;
while(i>j&&p->next){
p=p->next;
j++;
}
q= p->next;
p->next=q->next;
delete q;
}
}
}
void printList(LinkList &L){
//打印单链表
LNode *p = L->next;
while(p){
int a=p->data;
printf("%d ",a);
p=p->next;
}
printf("\n");
}
int main(){
LinkList L;
printf("------------------\n");
printf("--1.初始化单链表--\n");
printf("--2.头插法创建--\n");
printf("--3.尾插法创建--\n");
printf("--4.按值查找--\n");
printf("--5.按为查找--\n");
printf("--6.删除元素e--\n");
printf("--7.打印链表--\n");
printf("-------------\n");
int n=1;
ElemType e;
while(n!=0){
printf("选择功能:");
scanf("%d",&n);
switch(n){
case 1:
InitList(L);
break;
case 2:
printf("输入插入的位数:");
scanf("%d",&n);
CreateList_H(L,n);
break;
case 3:
printf("输入插入的位数:");
scanf("%d",&n);
CreateList_R(L,n);
break;
case 4:
printf("输入查找的值:");
scanf("%d",&e);
n=GetCode(L,e);
printf("%d\n",n);
break;
case 5:
printf("输入查找的位数:");
scanf("%d",&n);
e=GetElem(L,n,e);
printf("%d\n",e);
break;
case 6:
printf("输入删除的值:");
scanf("%d",&e);
ListDel(L,e);
break;
case 7:
printList(L);
break;
case 0:
break;
default: printf("请输入正确的选项!\n");
}
}
printf("退出成功!");
}
阅读全文
1 0
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作!
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 【安卓学习之常见问题】 多国语言横竖屏时,自动切换到默认语言(android:configChanges的使用)
- C# 操作excel
- python实例练习
- 敏捷方法--《启示录》
- MailBee.NET Objects撰写邮件教程(三):请求阅读/发送状态提示
- 单链表的基本操作
- XSS的原理分析
- Codevs 4246 奶牛的身高
- 查看app或是静态库动态库中的函数使用情况
- 集合系列LinkedList
- 设置 jupyter notebook 可远程访问
- jsp中引用的jstl 标签库和fmt标签
- HDU6090---Rikka with Graph(2017多校联赛:思路题)
- Ubuntu 14.10 安装 Android studio