您的位置:首页 > 理论基础 > 数据结构算法

单向链表的基本操作

2017-03-07 16:08 309 查看
数据结构的基础知识之一:单向链表的基本操作。

我专门写了一个程序,其中包含尽可能多的链表操作。希望该程序能在工作中帮助到大家~同时也方便大家复习链表。

#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef int datatype;
typedef struct node{
datatype data;
struct node *next;
}linknode,*link;

/*Createlist*/
link CreateList(){
int a;
link H,p,r;
H = (link)malloc(sizeof(linknode));//建立头节点
r = H;
cin>>a;
while(a != -1){
p = (link)malloc(sizeof(linknode));//申请新节点
p->data = a;
r->next = p;
r = p;//存入数据,将新节点链入表尾
cin>>a;
}
r->next = NULL;
return H;
}

/*查找*/
link GetElem(link H,int i){
int j = -1;
link p = H;
if(i<0) return NULL;
while(p->next&&j<i){
p = p->next;
j++;
}
if(i==j) return p;
else return NULL;//查找失败,即i>表长
}

/*按值查找*/
link LocateElem(link H,datatype e){
link p = H->next;
while(p && p->data!=e){
p = p->next;
}
return p;//若p->data==e则返回指针p;否则p必为空,返回NULL
}

/*将一定值e插在元素ai之前*/
int ListInsert(link H,int i,datatype e){
link p,q;
p = GetElem(H,i-1);
if(p == NULL) return -1;
q = (link) malloc(sizeof(linknode));
q->data = e;
q->next = p->next;/*插入新节点*/
p->next = q;
return 0;
}

/*删除*/
int ListDel(link H,int i){
link p,q;
if(i==0) p = H;
else p = GetElem(H,i-1);
if(p && p->next){
q = p->next;
p->next = q->next;
free((char*)q);
return 0;
}
return -1;
}

/*链表翻转*/
void L1nToLn1(link H){
link p,q;
p = H->next;
H->next = NULL;
while(p){
q = p;
p = p->next;
q->next = H->next;
H->next = q;
}
}

/*最大值返回前一个的指针*/
link Adjmax(link H){
link p,p1,q;
int m0,m1;
p = H->next;
p1 = p;
if(p1 == NULL) return NULL;
q = p->next;
if(q == NULL) return NULL;/*表长为1*/
m0 = p->data+q->data;
while(q->next){
p = q;
q = q->next;
m1 = p->data+q->data;
if(m1>m0){
p1 = p;
m0 = m1;
}
}
return p1;
}

/*链表合并并递增*/
void Merge(link A,link B){
link r,p,q;
p = A->next;
q = B->next;
free(B);
r = A;
while(p && q){
if(p->data <= q->data){
r->next = p;
r = p;
p = p->next;
}
else{
r->next = q;
r = q;
q = q->next;
}
}
if(p == NULL) p = q;
r->next = p;
}

void ListPrint(link H){
link a,b;
a = H->next;
while(a != NULL){
cout<<a->data<<"<";
b = a;
a = a->next;
free(b);
}
}

int main(){
link H;
H = CreateList();
L1nToLn1(H);
ListPrint(H);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 链表