c语言 链表操作:建立,显示及节点的插入,删除

如题所述

先写个头文件,包含链表的各种操作。具体代码如下:
#ifndef LINKEDLIST_H_INCLUDED
#define LINKEDLIST_H_INCLUDED

//线性表的单链表存储结构
struct LNode
{
ElemType data;
LNode *next;
};
typedef LNode *LinkList; // 另一种定义LinkList的方法

//单链表线性表的基本操作(12个)
int InitList(LinkList &L)
{
// 操作结果:构造一个空的线性表L
L=(LinkList)malloc(sizeof(LNode)); // 产生头结点,并使L指向此头结点
if(!L) // 存储分配失败
exit(0);
L->next=NULL; // 指针域为空
return 1;
}

void CreateList_L(LinkList &L, int n) // 算法2.11
{
// 逆位序输入(随机产生)n个元素的值,建立带表头结点的单链线性表L
LinkList p;
int i;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL; // 先建立一个带头结点的单链表
for (i=n; i>0; --i)
{
p = (LinkList)malloc(sizeof(LNode)); // 生成新结点
p->data = rand()%200; // 改为一个随机生成的数字(200以内)
p->next = L->next;
L->next = p; // 插入到表头
}
} // CreateList_L

int DestroyList(LinkList &L)
{
// 初始条件:线性表L已存在。操作结果:销毁线性表L
LinkList q;
while(L)
{
q=L->next;
free(L);
L=q;
}
return 1;
}

int ClearList(LinkList L) // 不改变L
{
// 初始条件:线性表L已存在。操作结果:将L重置为空表
LinkList p,q;
p=L->next; // p指向第一个结点
while(p) // 没到表尾
{
q=p->next;
free(p);
p=q;
}
L->next=NULL; // 头结点指针域为空
return 1;
}

int ListEmpty(LinkList L)
{
// 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE
if(L->next) // 非空
return 0;
else
return 1;
}

int ListLength(LinkList L)
{
// 初始条件:线性表L已存在。操作结果:返回L中数据元素个数
int i=0;
LinkList p=L->next; // p指向第一个结点
while(p) // 没到表尾
{
i++;
p=p->next;
}
return i;
}

int GetElem(LinkList L,int i,ElemType &e) // 算法2.8
{
// L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回1,否则返回-1
int j=1; // j为计数器
LinkList p=L->next; // p指向第一个结点
while(p&&j<i) // 顺指针向后查找,直到p指向第i个元素或p为空
{
p=p->next;
j++;
}
if(!p||j>i) // 第i个元素不存在
return -1;
e=p->data; // 取第i个元素
return 1;
}

int LocateElem(LinkList L,ElemType e,int(*compare)(ElemType,ElemType))
{
// 初始条件: 线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
// 操作结果: 返回L中第1个与e满足关系compare()的数据元素的位序。
// 若这样的数据元素不存在,则返回值为0
int i=0;
LinkList p=L->next;
while(p)
{
i++;
if(compare(p->data,e)) // 找到这样的数据元素
return i;
p=p->next;
}
return 0;
}

int PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e)
{
// 初始条件: 线性表L已存在
// 操作结果: 若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,
// 返回1;否则操作失败,pre_e无定义,返回-1
LinkList q,p=L->next; // p指向第一个结点
while(p->next) // p所指结点有后继
{
q=p->next; // q为p的后继
if(q->data==cur_e)
{
pre_e=p->data;
return 1;
}
p=q; // p向后移
}
return -1;
}

int NextElem(LinkList L,ElemType cur_e,ElemType &next_e)
{
// 初始条件:线性表L已存在
// 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,
// 返回1;否则操作失败,next_e无定义,返回-1
LinkList p=L->next; // p指向第一个结点
while(p->next) // p所指结点有后继
{
if(p->data==cur_e)
{
next_e=p->next->data;
return 1;
}
p=p->next;
}
return -1;
}

int ListInsert(LinkList L,int i,ElemType e) // 算法2.9。不改变L
{
// 在带头结点的单链线性表L中第i个位置之前插入元素e
int j=0;
LinkList p=L,s;
while(p&&j<i-1) // 寻找第i-1个结点
{
p=p->next;
j++;
}
if(!p||j>i-1) // i小于1或者大于表长
return -1;
s=(LinkList)malloc(sizeof(LNode)); // 生成新结点
s->data=e; // 插入L中
s->next=p->next;
p->next=s;
return 1;
}

int ListDelete(LinkList L,int i,ElemType &e) // 算法2.10。不改变L
{
// 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
int j=0;
LinkList p=L,q;
while(p->next&&j<i-1) // 寻找第i个结点,并令p指向其前趋
{
p=p->next;
j++;
}
if(!p->next||j>i-1) // 删除位置不合理
return -1;
q=p->next; // 删除并释放结点
p->next=q->next;
e=q->data;
free(q);
return 1;
}

int ListTraverse(LinkList L,void(*vi)(ElemType))
// vi的形参类型为ElemType,与bo2-1.cpp中相应函数的形参类型ElemType&不同
{
// 初始条件:线性表L已存在
// 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败
LinkList p=L->next;
while(p)
{
vi(p->data);
p=p->next;
}
printf("\n");
return 1;
}
LinkList ReverseList(LinkList phead)//实现链表的逆置
{
LinkList p,q,r;
p=phead;
q=r=NULL;
while(p)
{
q=p->next;
p->next=r;
r=p;
p=q;
}
return r;

}

#endif // LINKEDLIST_H_INCLUDED

再写主函数:
#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
#include "LinkedList.h"

int compare(ElemType c1,ElemType c2)
{
if(c1==c2)
return 1;
else
return 0;
}

void visit(ElemType c)
{
printf("%d ",c);
}

void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc)
{
// 已知单链线性表La和Lb的元素按值非递减排列。
// 归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
LinkList pa, pb, pc;
pa = La->next;
pb = Lb->next;
Lc = pc = La; // 用La的头结点作为Lc的头结点
while (pa && pb)
{
if (pa->data <= pb->data)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb; // 插入剩余段
free(Lb); // 释放Lb的头结点
} // MergeList_L

int main()
{
LinkList L;
ElemType e,e0;
int i;

InitList(L);
for(i=1; i<=10; i++)
ListInsert(L,1,10-i);
//CreateList_L(L,10);
printf("在L的表尾依次插入10个数据后:L=");
ListTraverse(L,visit);

GetElem(L,4,e);
printf("第4个元素的值为:%d\n",e);

ListDelete(L,4,e); // 删除第4个数据
printf("删除第4个数据后:L=");
ListTraverse(L,visit);

DestroyList(L);

LinkList La, Lb, Lc;
int a[4] = {3,5,8,11};
int b[7] = {2,6,8,9,11,15,20};
InitList(La);
InitList(Lb);
for(i=1; i<=4; i++)
ListInsert(La, i, a[i-1]);
for(i=1; i<=7; i++)
ListInsert(Lb, i, b[i-1]);
printf("La=");
ListTraverse(La,visit);
printf("Lb=");
ListTraverse(Lb,visit);

MergeList_L(La, Lb, Lc);

printf("Lc=");
ListTraverse(Lc,visit);

DestroyList(Lc);
}
你不需要的操作可以注释掉!追问

    真么办,求解

追答

这是两个文件,一个是头文件.h;
一个是cpp文件。你不能把两个文件直接放在一起,我用的是CodeBlocks,运行没有问题。

温馨提示:内容为网友见解,仅供参考
无其他回答

c语言 链表操作:建立,显示及节点的插入,删除
ElemType data;LNode *next;};typedef LNode *LinkList; \/\/ 另一种定义LinkList的方法 \/\/单链表线性表的基本操作(12个)int InitList(LinkList &L){ \/\/ 操作结果:构造一个空的线性表L L=(LinkList)malloc(sizeof(LNode)); \/\/ 产生头结点,并使L指向此头结点 if(!L) \/\/ 存储分配失败 ...

链表中的怎么使用指针进行链表的建立、插入、删除等处理操作
1、链表建立需要节点。这是存储数据的基础,以C++语言为例,要建立这样的节点(假设存储信息的类型作为一个模板)template <class DataType> struct Node{ DataType info;\/\/节点存储的信息 Node<DataType> *next;};2、因为你是使用指针,那么,就需要动态创建结构体。使用new 运算符在堆内存中创建 Node...

求大神救急,编写C语言程序,内容是建立一个链表,还有链表的插入与删除...
include<iostream> using namespace std;typedef struct lnode { int data;lnode *next;}lnode,*linklist;int m;int listinsert(linklist &l,int i,int e)\/\/在带头节点的单链表中第i个元素插入元素e { int j=0;linklist p,s;p=new lnode;p=l;s=new lnode;while(p&&jnext;++j;} ...

用c语言实现单链表以及单链表的建立、清空、插入、删除、查找、修改等...
程序如下:include <string.h>#include <stdio.h>#include <stdlib.h>struct st{long num; char name[20]; float score; struct st *next;};\/* 创建结点 *\/struct st *creat(){struct st *head=NULL,*p,*q;q=p=(struct st *)malloc(sizeof(struct st));scanf("%ld%s%f",&p->num...

如何用C语言创建一个链表,实现增、删、改、查?
\/\/1、写出建立一个带头结点的线性链表的函数,其中每个结点包括学号、姓名、分数三个数据域。函数形式如下:NODE *creat_link(int direction){ NODE *head,*p,*tail;int xh,i=1;if(direction==1) \/\/当direction的值为1时,新建立的结点连到尾部 { tail=head=(NODE *)malloc(sizeof(NODE));h...

用C语言编写链式存储结构下实现线性表的创建,插入,删除,按值查找
struct LNode* next;\/\/链表指针 }LNode,*LinkList;\/*头插法-建立单链表*\/ LinkList HeadCreate(LinkList la){ int num;la=(LinkList)malloc(sizeof(LNode));\/\/建立头结点 la->next=NULL;scanf("%d",&num);while(num!=10){ LNode *p=(LinkList)malloc(sizeof(LNode));p->data=num...

用c语言调用实现带头结点的单链表的建立,插入,删除,查找的源代码
直接插入。小于的话,移动有序表后插入 int j= i-1; int x = a[i]; \/\/复制为哨兵,即存储待排序元素 a[i] = a[i-1]; \/\/先后移一个元素 while(x < a[j]){ \/\/查找在有序表的插入位置 a[j+1] = a[j]; j--; \/\/元素后移 } ...

...法建立带头结点的单链表,实现单链表上的插入,删除计数,查找,修改,输...
\/* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 *\/ Status ClearList(LinkList *L){ LinkList p,q;p=(*L)->next; \/* p指向第一个结点 *\/ while(p) \/* 没到表尾 *\/ { q=p->next;free(p);p=q;} (*L)->next=NULL; \/* 头结点指针域为空 *\/ return...

...C语言)中实现有序链表的插入,删除结点基本操作,及两个有序链表的归 ...
void creat(); \/\/建立单向动态链表。此函数带回一个指向链表头的指针,用于参赛选手的录入void del(); \/\/用于删除结点,用于参赛选手的删除void search(); \/\/参赛选手成绩的查询void print(); \/\/用于输出链表void rank(); \/\/按个人平均成绩从高到低的顺序进行排序void update(); \/\/参赛选手的修改void menu...

C语言实现单链表的建立、输入、插入、删除、查找元素并返回位置_百度知 ...
时间:2010年8月28日17:19:49 功能:C语言实现单链表的建立、输入、插入、删除、查找元素并返回位置 \/ include"stdio.h"include"stdlib.h"include"malloc.h"\/*假设输入的数据为3个--我比较好操作-_-*\/ define size 3 typedef struct List { int num;int shuju;struct List *next;}list;\/*...

相似回答