单链表夜市线性表的一种表现形式,一个表节点由一个数据空间和一个指针域组成。指针域记录下一个结点的地址。
链表在插入,删除功能中效率高。但是读取某个结点的时候需要顺序读取。效率不如顺序存储形式。
下面是一些链表实现的代码:
// 链表.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#define ERROR -1
#define OK 1;
struct Lnode
{
int data;
struct Lnode *next;
};
void init(Lnode *l) //初始化。头结点的data存的是链表的长度
{
l->next=NULL;
l->data=0;
}
int insertElem(Lnode *l,int pos,int e) //插入
{
if(l->data<pos-1||pos<1) return ERROR;
l->data++;
for(int i=0;i<pos-1;i++)
l=l->next;
Lnode *newNode=(Lnode*)malloc(sizeof(Lnode));
newNode->data=e;
newNode->next=l->next;
l->next=newNode;
return OK;
}
int CreatList(Lnode *l) //直接创建一个链表,输入0的时候表示存取完毕
{
Lnode *head=l;
int data=0;
do
{
cin>>data;
if(data!=0)
head->data++;
else
break;
Lnode *node=(Lnode*)malloc(sizeof(Lnode));
node->data=data;
node->next=l->next;
l->next=node;
l=l->next;
}while(data);
return OK;
}
int getElem(Lnode *l,int pos) //取某个位置的元素
{
/*if(pos<0||pos>l->data) return ERROR;*/
for(int i=0;i<=pos;i++)
l=l->next;
return l->data;
}
void show(Lnode *l)
{
l=l->next;
while(l)
{
cout<<l->data;
l=l->next;
}
}
int ListDelete(Lnode *l,int pos) //删除某个位置的元素
{
if(pos<0||pos>l->data) return ERROR;
l->data--;
for(int i=0;i<pos-1;i++)
l=l->next;
int a=l->next->data;
l->next=l->next->next;
return a;
}
void MergeList_L(Lnode *la,Lnode *lb,Lnode *lc) //将生序排列的两个链表合并到LC
{
la=la->next;
lb=lb->next;
Lnode *head=lc;
while(la&&lb)
{
if(la->data<lb->data)
{
lc->next=la;
la=la->next;
}
else
{
lc->next=lb;
lb=lb->next;
}
lc=lc->next;
head->data++;
}
if(la)
{
lc->next=la;
/*head->data+=;*/
}
if(lb)
{lc->next=lb;head->data++;}
}
int _tmain(int argc, _TCHAR* argv[])
{
struct Lnode l,lb,lc;
init(&l);
init(&lb);
init(&lc);
//cout<<l.data;
//insertElem(&l,1,1);
//insertElem(&l,2,2);
//insertElem(&l,3,3);
CreatList(&l);
CreatList(&lb);
MergeList_L(&l,&lb,&lc);
/*for(int i=0;i<10;i++)
{
cout<<getElem(&lc,i);
}*/
show(&l);
//cout<<getElem(&l,2);
// cout<<ListDelete(&l,5);
return 0;
}