大侠们怎么用C语言实现初始化一个链表啊~~~~~~~~~~

最好给我代码当例子看看好吗...不要算法..

单链表:

#include<stdio.h>
#include<stdlib.h>

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

void InitList(LinkList *L) //初始化
{
*L = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL;
}
char GetElem(LinkList L,int i) //返回i 位置的元素
{
//L为带头结点的单链表的头指针。
LinkList p;
int j;
p = L->next; j = 1; //初始化,p指向第一个结点,j为计数器

while(p && j<i)
{
p = p->next;
++j;
}
if(!p || j>i) exit(1); //i位置元素不存在
return(p->data);
}

void ListInsert(LinkList *L,int i,char e)//插入
{
//在带头结点的单链线性表L中第i个位置前插入元素e
LinkList p,s;
int j;
p = *L; j = 0;
while(p && j<i-1)//寻找第i-1个结点
{
p = p->next;
++j;
}
if(!p || j>i-1) exit(1); //i位置不正确
s = (LinkList)malloc(sizeof(LNode)); //新结点
s->data = e;
s->next = p->next;
p->next = s;
}

void ListDelete(LinkList *L,int i)//删除i位置元素
{
LinkList p,q;
int j;
p = *L; j = 0;

while(p->next && j<i-1)//寻找第i个结点
{//这以p->next开始是为了避开头结点,头结点不可删除
//而且这样是必须的,这样是为了有被删除点前面结点的地址,这样才能有前继结点,连接删除点的后继结点.
p = p->next;
++j;
}

if(!(p->next) || j>i-1) exit(1); //删除位置不合理
q = p->next; //删除该点
p->next = q->next;
free(q);
}

void CreateList(LinkList *L,int n)
{
//逆位序输入n个元素的值,建立带表头结点的单链线性表L
int i;
LinkList p;
(*L) = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL; //先建立带头结点的单链表
for(i=n;i>0;--i)
{
p = (LinkList)malloc(sizeof(LNode)); //生成新结点
scanf("%c",&p->data);
fflush(stdin);
p->next = (*L)->next;
(*L)->next = p;
}

//*****************另一插入法**************************
q = *L = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL;

for(i=n;i>0;--i)
{
p = (LinkList)malloc(sizeof(LNode));
scanf("%c",&p->data);
fflush(stdin);
p->next = NULL;
q->next = p;
q = p;
//q->next = p;
}
//***********************************************************
}
void MergeList(LinkList *La,LinkList *Lb,LinkList *Lc)
{
//链表La,Lb按递增排列
LinkList pa,pb,pc;
pa = (*La)->next;
pb = (*Lb)->next;
(*Lc) = pc = (*La);

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头结点
}
void display(LinkList *L)
{
LinkList di;
di = (*L)->next;
while(di!=NULL)
{
printf("%c\t",di->data);
di = di->next;
}
printf("\n");
}
void main()
{
LinkList link,link2,link3;

InitList(&link);
InitList(&link2);
CreateList(&link,5);
CreateList(&link2,5);
display(&link);
display(&link2);
MergeList(&link,&link2,&link3);
display(&link3);
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-04-25
单链表:
#include<stdio.h>
#include<stdlib.h>
typedef
struct
LNode
{
char
data;
struct
LNode
*next;
}LNode,*LinkList;
void
InitList(LinkList
*L)
//初始化
{
*L
=
(LinkList)malloc(sizeof(LNode));
(*L)->next
=
NULL;
}
char
GetElem(LinkList
L,int
i)
//返回i
位置的元素
{
//L为带头结点的单链表的头指针。
LinkList
p;
int
j;
p
=
L->next;
j
=
1;
//初始化,p指向第一个结点,j为计数器
while(p
&&
j<i)
{
p
=
p->next;
++j;
}
if(!p
||
j>i)
exit(1);
//i位置元素不存在
return(p->data);
}
void
ListInsert(LinkList
*L,int
i,char
e)//插入
{
//在带头结点的单链线性表L中第i个位置前插入元素e
LinkList
p,s;
int
j;
p
=
*L;
j
=
0;
while(p
&&
j<i-1)//寻找第i-1个结点
{
p
=
p->next;
++j;
}
if(!p
||
j>i-1)
exit(1);
//i位置不正确
s
=
(LinkList)malloc(sizeof(LNode));
//新结点
s->data
=
e;
s->next
=
p->next;
p->next
=
s;
}
void
ListDelete(LinkList
*L,int
i)//删除i位置元素
{
LinkList
p,q;
int
j;
p
=
*L;
j
=
0;
while(p->next
&&
j<i-1)//寻找第i个结点
{//这以p->next开始是为了避开头结点,头结点不可删除
//而且这样是必须的,这样是为了有被删除点前面结点的地址,这样才能有前继结点,连接删除点的后继结点.
p
=
p->next;
++j;
}
if(!(p->next)
||
j>i-1)
exit(1);
//删除位置不合理
q
=
p->next;
//删除该点
p->next
=
q->next;
free(q);
}
void
CreateList(LinkList
*L,int
n)
{
//逆位序输入n个元素的值,建立带表头结点的单链线性表L
int
i;
LinkList
p;
(*L)
=
(LinkList)malloc(sizeof(LNode));
(*L)->next
=
NULL;
//先建立带头结点的单链表
for(i=n;i>0;--i)
{
p
=
(LinkList)malloc(sizeof(LNode));
//生成新结点
scanf("%c",&p->data);
fflush(stdin);
p->next
=
(*L)->next;
(*L)->next
=
p;
}
//*****************另一插入法**************************
q
=
*L
=
(LinkList)malloc(sizeof(LNode));
(*L)->next
=
NULL;
for(i=n;i>0;--i)
{
p
=
(LinkList)malloc(sizeof(LNode));
scanf("%c",&p->data);
fflush(stdin);
p->next
=
NULL;
q->next
=
p;
q
=
p;
//q->next
=
p;
}
//***********************************************************
}
void
MergeList(LinkList
*La,LinkList
*Lb,LinkList
*Lc)
{
//链表La,Lb按递增排列
LinkList
pa,pb,pc;
pa
=
(*La)->next;
pb
=
(*Lb)->next;
(*Lc)
=
pc
=
(*La);
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头结点
}
void
display(LinkList
*L)
{
LinkList
di;
di
=
(*L)->next;
while(di!=NULL)
{
printf("%c\t",di->data);
di
=
di->next;
}
printf("\n");
}
void
main()
{
LinkList
link,link2,link3;
InitList(&link);
InitList(&link2);
CreateList(&link,5);
CreateList(&link2,5);
display(&link);
display(&link2);
MergeList(&link,&link2,&link3);
display(&link3);
}
第2个回答  2008-11-11
看看一些C语言书上都有啊!

大侠们怎么用C语言实现初始化一个链表啊~~~
\/\/逆位序输入n个元素的值,建立带表头结点的单链线性表L int i;LinkList p;(*L) = (LinkList)malloc(sizeof(LNode));(*L)->next = NULL; \/\/先建立带头结点的单链表 for(i=n;i>0;--i){ p = (LinkList)malloc(sizeof(LNode)); \/\/生成新结点 scanf("%c",&p->data);fflush(...

用C语言编写程序实现顺序表的插入操作,并且从键盘读取元素给顺序表初...
\/\/printf("为线性表赋值:");\/\/for(i=0;i<=L.length-1;i++)\/\/scanf("%5d",&L.elem[i]);L.length =0;\/\/如果是初始化,那么长度就是0 }\/\/初始化线性表 int InsertSq(List &L,int i,int e){ int *p=NULL, *q=NULL;\/\/所有变量的定义都必须置前 if(i<0||i>L.length+1)...

求助!大侠帮帮忙,设计一个c语言程序,输出100到1000的素数。
int iTag = iNum \/ 2 + 1;\/\/ 如 200 \/ 2 + 1 = 101,大于101就没意义了 for (int i = 2; i < iTag + 1; i++){ if (iNum % i == 0)return false;} return true;}

(有关 C语言\\C++ 的链表):创建链表的函数 node * create()中的那个*...
(1)node * create()中*表示这个函数的返回值是一个指针,而这个指针指向的类型就是node型。也就是说node * create()表示的是create()函数返回的值类型是指向node型数据的指针。(2)至于空格,纯粹是编程风格的问题,看你习惯怎么写,node * create()node *create()node* create()node*create(...

请问大侠们关于c语言编写的建立链表的子程序的问题,为什么总是输入数据...
while的条件判断是个赋值语句,i始终被赋值为1,当然无限循环了。改为while(i==1)

因为,刚学的C语言,遇到了问题,大侠们,字典一下。。
include<stdio.h> void main(void) \/\/这里是括号,不是尖括号 { int x=4294967296; \/\/这里缺少分号结束语句。printf("\\nx=%d",x); \/\/这里引号不全。}

C语言编程,有一个语句,我不知道什么意思,有哪位大侠愿意帮忙
这个i就是用来控制{}里面的语句执行次数的,{}里面的语句不使用i,但是i用来控制里面语句执行的次数,n-2+1次。也就是i=2执行一次、i=3再执行一次、……最后i=n执行一次,没有i的话程序就没办法控制执行次数。

关于C语言拓扑排序的问题,哪位大侠帮帮忙啊,谢谢!
存储结构就用最简单的数组吧,数组中有三个元素,编号,名称,先修课程。我们假设把一系列的又关联性的课程炼成一串, 如;c1->c2->c3.这样的话,上述问题其实就转化成来这样的一个问题:串起来之后哪个链表最长,以及怎么样安排课程才能让所有链表最短。因为假设每门课的时间时一样的。这样的话,...

c语言:有哪位大侠可以帮我解释一下下面这道题目???
int prime(int n) \/\/ 这里为定义被调函数prime int表示被调函数返回值类型为整形prime为函数名称int n表示定义一个形参n {int flag=1,i;\/\/这里有定义了一个flag的整形变量和一个i变量 for (i=2;i<n\/2 && flag==1;i++)\/\/i=2表示i从2开始进行循环、因为1不为素数i...

会c语言的来,麻烦各位大侠了。我怎么做都不对~~
(2)将满足条件的三位数进行组合,使得所选出的3个三位数之间9个数字没有重复。i).先定义一个函数,用于对比两个三位数字,重复-返回0;不重复-返回1.int comp(int a,int b){int t,flag=1;t=a;while(t){t=t%10;if(t==b%10)‖(t==b%100)‖(t==b%1000){flag=0; return 0; ...

相似回答