考研数据结构第二章线性表单链表定义操作及代码实现
1.初始化操作(初始化带头结点的单链表,构造一个空的单链表,初始化next指针 )
#define OK 1
#define ERROR 0
int InitLinkList(LinkList &L){
L = (LinkList)malloc(sizeof(LNode));
if(L!=NULL){
L->next = NULL;
return OK;
}
else{
return ERROR;
}
}
2.采用头插法建立单链表(特点:每次在头节点后插入新结点)
LinkList CreatList1(LinkList &L){
LNode *node;
int x;
if(!L)
InitLinkList(L);
scanf("%d",&x);
while(x!=9999){
node = (LNode *)malloc(sizeof(LNode));
node->data = x;
node->next = L->next;
L->next = node;
scanf("%d",&x);
}
return L;
}
3.采用尾插法建立单链表(特点:每次在尾结点后插入新结点)
LinkList CreatList2(LinkList &L){
LNode *node;int x;LNode *r = L;
if(!L)
InitLinkList(L);
scanf("%d",&x);
while(x!=9999){
node = (LNode *)malloc(sizeof(LNode));
node->data= x;
r->next = node;
scanf("%d",&x);
}
r->next = NULL;
return L;
}
4.按序号查找结点值
LNode *GetElem(LinkList L,int i){
int j =1;
LNode *p =L->next;
if(i==0)
return L;
if(i<1)
return NULL;
while(p&&j<i){
p = p->next;
j++;
}
return p;
}
5.按值查找结点值
LNode *LocateElem(LinkList L,ElemType e){
LNode *p=L->next;
while(p&&p->data!=e){
p=p->next;
}
return p;
}
6.插入节点操作
int LinkLen(LinkList L,int i=0){
LinkList *Node;
while(L->next!=NULL){
i++;
L=L->next;
}
return i;
}
LinkList InsertElem(LinkList &L,int i){
int length;
length=LinkLen(L);
if(i>0&&i<=length){
LNode *node;
int x;
scanf("%d",&x);
node->data=x;
LNode *p = L->next;
for(int j=1;j<i;j++){
p=p->next;
}
node->next=p->next;
p->next=node;
}
return L;
}
7.删除结点操作
LinkList DeletElem(LinkList &L,int i){
int length;
length=LinkLen(L);
if(i>0&&i<=length){
LNode *p,*q;
p=GetElem(L,i-1);
q=p->next;
p->next=q->next;
free(q);
}
}
完整代码
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
#define OK 1
#define ERROR 0
int InitLinkList(LinkList &L){
L = (LinkList)malloc(sizeof(LNode));
if(L!=NULL){
L->next = NULL;
return OK;
}
else{
return ERROR;
}
}
LinkList CreatList1(LinkList &L){
LNode *node;
int x;
if(!L)
InitLinkList(L);
scanf("%d",&x);
while(x!=9999){
node = (LNode *)malloc(sizeof(LNode));
node->data = x;
node->next = L->next;
L->next = node;
scanf("%d",&x);
}
return L;
}
LinkList CreatList2(LinkList &L){
LNode *node;int x;LNode *r = L;
if(!L)
InitLinkList(L);
scanf("%d",&x);
while(x!=9999){
node = (LNode *)malloc(sizeof(LNode));
node->data= x;
r->next = node;
scanf("%d",&x);
}
r->next = NULL;
return L;
}
LNode *GetElem(LinkList L,int i){
int j =1;
LNode *p =L->next;
if(i==0)
return L;
if(i<1)
return NULL;
while(p&&j<i){
p = p->next;
j++;
}
return p;
}
LNode *LocateElem(LinkList L,ElemType e){
LNode *p=L->next;
while(p&&p->data!=e){
p=p->next;
}
return p;
}
int LinkLen(LinkList L,int i=0){
LinkList *Node;
while(L->next!=NULL){
i++;
L=L->next;
}
return i;
}
LinkList InsertElem(LinkList &L,int i){
int length;
length=LinkLen(L);
if(i>0&&i<=length){
LNode *node;
int x;
scanf("%d",&x);
node->data=x;
LNode *p = L->next;
for(int j=1;j<i;j++){
p=p->next;
}
node->next=p->next;
p->next=node;
}
return L;
}
LinkList DeletElem(LinkList &L,int i){
int length;
length=LinkLen(L);
if(i>0&&i<=length){
LNode *p,*q;
p=GetElem(L,i-1);
q=p->next;
p->next=q->next;
free(q);
}
}
int main(){
return 0;
}