单链表的基本操作

来源:互联网 发布:三维设计软件 编辑:程序博客网 时间: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("退出成功!");
 }