您的位置:首页 > 其它

链表的基本操作

2017-09-26 17:08 381 查看
c语言的链表的基本操作

// Test.cpp : Defines the entry point for the console application.
//
#include stdafx.h
#include <stdio.h>
#include "stdlib.h"
//宏定义
#define TRUE   1
#define FALSE   0
#define OK    1
#define ERROR   0
#define INFEASIBLE -1
#define OVERFLOW -2

#define LT(a,b)   ((a)<(b))
#define N = 100

typedef int Status;
typedef int ElemType;

typedef struct LNode{
ElemType  data;
struct LNode   *next;
}LNode, *LinkList;

/************************************************************************/
/*
初始化链表
*/
/************************************************************************/
Status initList(LinkList &L){
/*单链表的初始化*/
L = (LinkList)malloc(sizeof(LNode));    //申请一个头节点
if(!L) exit(OVERFLOW);          //申请空间失败
L->next=NULL;               //建立一个带都节点的空链表
return OK;

/*
需要改变指针的指针,所以参数必须是引用或者是 *L:
(*L) = (Lnode *)malloc(sizeof(Lnode));
(*L)->next=NULL;
return 1;
*/

}

/************************************************************************/
/*
创建链表
*/
/************************************************************************/
void createList(LinkList L, int n){
/*单链表的初始化*/
if (!L) {
initList(L);
}
ElemType data;
LinkList p,q = L;
printf("输入节点数据的个数%d:\r\n", n);
for(int i = 0; i<n; i++) {
p = (LinkList) malloc( sizeof(LNode)); //申请一个新节点
scanf("%d",&data);
p->data = data;
p->next = q->next;
q->next = p;
q = p;
}
}
/************************************************************************/
/* 在第i位置插入e
*/
/************************************************************************/
Status insertList(LinkList L, ElemType e, int i){
LinkList s, p = L;
int j = 0;
while (p && j<i){               //寻找i节点
p = p->next;
j++;
}
if (!p ||j >i) return ERROR;
s = (LinkList) malloc(sizeof(LNode));       //生成新节点
s->data = e; s->next = p->next;         //插入L中
p->next = s;
return OK;

}

/************************************************************************/
/* 删除第i位置元素,并用e返回其值                                                                     */
/************************************************************************/
Status deleteListElem(LinkList L, int i, ElemType &e){
LinkList p, q;
int j = 0;
p = L;
while (p && j<i){
p = p->next;
++j;
}
if (!p->next || j>i)  return ERROR;   //删除的位置不对
q  = p->next; p->next = q->next;
e = q->data; free(q);           //释放节点
return OK;
}

/************************************************************************/
/*  插入排序
*/
/************************************************************************/

void  InsertSort(LinkList L)
{
LinkList  list;             /*为原链表剩下用于直接插入排序的节点头指针*/
LinkList  node;             /*插入节点*/
LinkList  p;
LinkList  q;

list = L->next;             /*原链表剩下用于直接插入排序的节点链表*/
L->next = NULL;             /*只含有一个节点的链表的有序链表。*/
while (list != NULL)   {    /*遍历剩下无序的链表*/
node = list, q = L;
while (q && node->data > q->data  ) {
p = q;
q = q->next;
}

if (q == L) {  /*插在第一个节点之前*/
L = node;
}  else {     /*p是q的前驱*/
p->next = node;
}
list = list->next;
node->next = q; /*完成插入动作*/

}
}

/************************************************************************/
/*
合并两个线性表
*/
/************************************************************************/

void mergeList(LinkList  &La, LinkList  &Lb,  LinkList &Lc){
LinkList pa, pb, pc;
pa  = La->next;
pb  = Lb->next;
Lc =  pc = La;
while (pa && pa) {
if (pa->data > pb->data) {
pc->next = pb;
pc = pb;
pb =pb->next;
}else{
pc->next = pa;
pc = pa;
pa =pa->next;
}
}
pc->next = pa? pa :pb;
free(Lb);
}

/************************************************************************/
/* 打印list
*/
/************************************************************************/
void printList(LinkList  L){
printf("当前值:");
LinkList p;
p = L->next;
while(p){
printf("%d ", p->data);
p = p->next;
}
printf("\r\n");
}

void main()
{
LinkList  La,Lb,Lc;
ElemType e;
int init,i;
printf("LA:\r\n");
initList(La);
createList(La, 5);
insertList(La, 7,  3);
printList(La);
deleteListElem(La, 3,  e);
printList(La);
InsertSort(La);
printList(La);

printf("Lb:\r\n");
initList(Lb);
createList(Lb, 4);
InsertSort(Lb);
printList(Lb);

printf("Lc:\r\n");
initList(Lc);
mergeList(La,   Lb,   Lc);
printList(Lc);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: