当前位置:首页 » 编程语言 » c语言链式结构后插法
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言链式结构后插法

发布时间: 2022-06-15 03:49:17

c语言数据结构的问题,用尾插法建立链表

voidcreat(linklistL)//L为一级指针,也是头指针
{
intf=1;
node*s,*r;
r=L;
while(f){
s=(node*)malloc(sizeof(node));
scanf("%s",s->a);
if(s->a[0]!='^'){
r->next=s;
r=s;
}
else{
f=0;
free(s);//释放s
}
}
r->next=NULL;//对r设next为NULL
}

⑵ c语言链表插入法求解下列问题

根据题意:

一、链表创建:根据输入的数字,动态创建任意多个节点插入链表。(题目规定n<=40,如不想使用malloc动态申请内存,需直接定义最大上限40个节点)。

二、链表排序:交换节点内容(不是地址),保留链表指针的值(*next的值)。

三、打印链表:利用链表指针遍历链表。

四、对动态申请的链表地址空间释放(在本程序中创建后程序就结束了,即使不写free释放,结束后也会释放。但在复杂程序中调用创建,后续还有代码,需像我代码中写函数动释放不用的内存,避免浪费)。

下面是代码:

#include <stdio.h>

#include <malloc.h>

typedef struct numStruct

{

int num;

struct numStruct *next;

}NST;

NST *insert2List(int num);//根据数字创建节点(动态),插入链表(首次自动生成头节点),成功返回头节点,失败返回NULL。

void showList(NST *nsthead);//打印链表

void px(NST *nsthead);//链表排序

void freeList(NST *nsthead);//释放链表内存

int main()

{

NST *nsthead=NULL;

int i=0,n=50,*nums=NULL;

while(n>40)

scanf("%d",&n);

nums=(int *)malloc(sizeof(int)*n);

if(!nums) return 1;

while(i<n)

scanf("%d",&nums[i++]);

i=0;

while(i<n)

nsthead=insert2List(nums[i++]);

px(nsthead);

showList(nsthead);

freeList(nsthead);

return 0;

}

void freeList(NST *nsthead)

{

NST *temp=NULL,*nst=NULL;

if(nsthead)

{

nst=nsthead->next;

while(nst!=NULL)

{

temp=nst;

nst=nst->next;

free(temp);

}

}

free(nsthead);

}

void showList(NST *nsthead)

{

if(nsthead)

while(nsthead->next!=NULL)

{

printf("%d ",nsthead->next->num);

nsthead=nsthead->next;

}

printf(" ");

}

void px(NST *nsthead)

{

NST *nt1=NULL,*nt2=NULL,ntTemp,*nextSave=NULL;

if(nsthead)

{

nt1=nsthead->next;

while(nt1)

{

nt2=nt1->next;

while(nt2)

{

if(nt1->num>nt2->num)

{

ntTemp=*nt1;

nextSave=nt1->next;

*nt1=*nt2;

nt1->next=nextSave;

nextSave=nt2->next;

*nt2=ntTemp;

nt2->next=nextSave;

}

nt2=nt2->next;

}

nt1=nt1->next;

}

}

}

NST *insert2List(int num)

{

static NST *nsthead=NULL,*nstTail=NULL;

NST *nstNew=NULL;


nstNew=(NST *)malloc(sizeof(NST));

if(!nstNew) return NULL;

nstNew->next=NULL;

nstNew->num=num;

if(!nsthead)

{

nsthead=(NST *)malloc(sizeof(NST));

if(!nsthead) return NULL;

nsthead->next=nstNew;

}

else

nstTail->next=nstNew;

nstTail=nstNew;

return nsthead;

}

⑶ 求解C语言中尾插法建立链表的原理

没看懂你的代码,但尾插法的原理是很简单的,它就是两句话:
设r初始时指向头结点
设n为要输入结点的个数
下面是伪代码:
while(n>0)
{
p=动态为p分配内存
p->data=为当前结点赋值
r->next=p 令r的指针域指向新结点p
r=p;// 令r指向新结点的地址(方便下一次的结点继续成为r的后继,反复如此......直至n不大于0)
n--
}

它的核心就两句话 r->next=p和r=p
如果你依然未懂的话,你就拿一张白纸,拿只笔,在纸上模拟上面那两句话。相信你肯定会懂的。

⑷ 链表实现尾插法(C语言)

据个例子:
#include <stdio.h>
#define LEN sizeof(struct A)
#define NULL 0
struct A
{ int a;
struct A* next;
};
struct A* new() /*建立链表的函数,返回链表头指针*/
{ struct A *p1,*p2,*head;
head=p2=p1=(struct A*)malloc(LEN);
scanf("%d",&p1->a;)
while(p2->a!=2155)/*以2155作为输入节点的结束标志*/
{p1=(struct A*)malloc(LEN);
scanf("%d",&p1->a);
p2->next=p1;
p2=p1;
}
p1->next=NULL;
return head;
}

⑸ C语言单向循环链表尾插法问题

建立单向循环链表的代码:

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

typedefstruct_A{
intdata;
struct_A*next;
}A;
typedefA*IA;

voidcreateDoubleLink(IA*header){
intdata;
IAp;
printf("inputdataendwith-1:");
scanf("%d",&data);
while(data!=-1){
p=(IA)malloc(sizeof(A));
p->data=data;
if(*header==NULL){
*header=p;
(*header)->next=*header;
}
else{
IAq=*header;
while(q->next!=*header){
q=q->next;
}
q->next=p;
q->next->next=*header;
}
scanf("%d",&data);
}
}

voidprint(IAheader){
IAp=header;
if(header==NULL)return;
while(1){
printf("%d ",p->data);
if(p->next==header)break;
p=p->next;
}
printf(" ");
}

intmain()
{
IAheader=NULL;
createDoubleLink(&header);
print(header);
return0;
}

头结点的意思是链表的第一个节点,但这个节点不保存数据。

⑹ c语言单链表尾插法编译通过运行终止,这个写法哪里有问题

尾部插入,那么第一步要做的是遍历链表到结尾,然后创建节点插入;你的代码中没有看到遍历的过程,不知道从哪插呢!

⑺ 用c语言尾插法建立带头结点的单链表

EOF!=(scanf("%d",&x)是什么意思?把scanf("%d",&x)写在while语句的上面为什么不行?
这里是指输入成功的话,执行下面的大括号里面语句。
pre->next是指当前结点的前一个结点,这里用于交换位置的。你可以画个图来查看他们之间的联系,就会很清楚了

⑻ 用C语言编写链式存储结构下实现线性表的创建,插入,删除,按值查找

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

typedef struct LNode{
int data; //链表数据
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;
p->next=la->next;
la->next=p;
scanf("%d",&num);
}
return la;
}

/*尾插法-建立单链表*/
LinkList TailCreate(LinkList la)
{
int num;
la=(LinkList)malloc(sizeof(LNode));
la->next=NULL;
LinkList s,r=la;
scanf("%d",&num);
while(num!=10)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=num;
r->next=s;
r=s;
scanf("%d",num);
}
r->next=NULL;
return la;
}

/*单链表遍历*/
void TravelList(LinkList la)
{
LinkList p=la->next;
while(p!=NULL)
{
printf("%d->",p->data);
p=p->next;
}
printf("\n");
}

/*单链表的按位查找*/
LinkList GetElem(LinkList la,int i)
{
int j=1;
LNode* p=la->next;
if(i<1)
return NULL;
while(p && j<i)
{
p=p->next;
j++;
}
return p;
}

/*单链表的按值查找*/
LinkList LocalElem(LinkList la,int e)
{
LNode* p=la->next;
while(p!=NULL && p->data!=e)
p=p->next;
return p;
}

/*单链表插入操作*/
bool InsertList(LinkList la,int i,int e)
{
//在la链表中的i位置插入数值e
int j=1;
LinkList p=la,s;
while(p && j<i)
{
p=p->next;
j++;
}
if(p==NULL)
return false;
if((s=(LinkList)malloc(sizeof(LNode)))==NULL)
return false;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}

/*单链表删除操作*/
bool DeleteList(LinkList la,int i)
{
int j=1;
LinkList p=la,q;
while(p && j<i) //p指向第i-1个元素
{
p=p->next;
j++;
}
if(p==NULL || p->next==NULL) //表示不存在第i-1个和第i的元素
return false;
q=p->next;
p->next=q->next;
free(q);
return true;
}

/*单链表的表长*/
int LengthList(LinkList la)
{
int nLen=0;
LinkList p=la->next;
while(p)
{
p=p->next;
nLen++;
}
return nLen;
}

/*单链表逆置*/
LinkList Reserve(LinkList la)
{
if(la==NULL || la->next==NULL)
return la;
LinkList p=la->next,q=p->next,r=q->next;
la->next=NULL;
p->next=NULL;
while(r!=NULL)
{
q->next=p;
p=q;
q=r;
r=r->next;
}
q->next=p;
la->next=q;
return la;
}

int main()
{
LNode la;
LinkList p;
p=HeadCreate(&la); //头插法创建单链表
TravelList(p);
printf("%p\n",GetElem(p,1)); //获得第1个结点地址
InsertList(p,2,10); //在链表的第2个位置插入元素10
TravelList(p);
DeleteList(p,3); //删除链表的第3个元素
TravelList(p);
printf("%d\n",LengthList(p)); //获得链表长度
p=Reserve(p);
TravelList(p);
return 0;
}

//运行结果
//5 6 12 7 8 14 9 3 2 5 14 10 头插法创建链表
//14->5->2->3->9->14->8->7->12->6->5-> 显示链表
//00382490 第一个结点的地址
//14->10->5->2->3->9->14->8->7->12->6->5-> 插入元素值为10的结点
//14->10->2->3->9->14->8->7->12->6->5-> 删除第三个结点
//11 获得链表长度
//5->6->12->7->8->14->9->3->2->10->14-> 链表逆置
//Press any key to continue

这是我写的一个线性表链式存储的综合程序,包含了你所要的创建、删除、插入、按值查找的功能,还有一些额外的功能。下面加注释的是程序运行结果,你可以参考试着改改程序,让程序更加完美。希望对你有帮助,呵呵!

⑼ c语言采用头插法或尾插法建立链表,从键盘输入递增有序的数据建立链表

#include<stdio.h>
#include<stdlib.h>
/*定义链表结点*/
typedefstructst_node{
intvalue;
structst_node*next;
}node_t;
/*定义链表*/
typedefstruct{
node_thead;
node_t*tail;
}list_t;
/*插入到队列尾部*/
voidlist_push_back(list_t*l,intvalue){
node_t*t=(node_t*)malloc(sizeof(node_t));
t->value=value;
t->next=NULL;

l->tail->next=t;
l->tail=t;
}
/*有序地插入元素*/
voidlist_push_sort(list_t*l,intvalue){
/*找出小于或等于value的节点,插入到该节点前面*/
node_t*p=l->head.next,*last=&l->head,*t;
for(;p;last=p,p=p->next){
if(value<=p->value){
t=(node_t*)malloc(sizeof(node_t));
t->value=value;
t->next=p;

last->next=t;
return;
}
}
/*如果没有小于或等于value的节点,则直接插入到末尾*/
list_push_back(l,value);
}
/*使用数组初始化有序链表*/
voidlist_init(list_t*l,int*p,ints){
inti=0;
l->head.next=NULL;
l->tail=&l->head;
for(;i<s;++i){
list_push_sort(l,p[i]);
}
}
/*清空链表*/
voidlist_clear(list_t*l){
node_t*p=l->head.next,*t;
while(p){
t=p;
p=p->next;
free(t);
}
l->head.next=NULL;
l->tail=&l->head;
}
/*合并有序链表*/
voidlist_merge(list_t*l,list_t*r,list_t*o){
node_t*pl=l->head.next,*pr=r->head.next;
while(pl||pr){
if(pl&&pr){
if(pl->value<=pr->value){
list_push_back(o,pl->value);
pl=pl->next;
}else{
list_push_back(o,pr->value);
pr=pr->next;
}
}elseif(pl){
list_push_back(o,pl->value);
pl=pl->next;
}else{
list_push_back(o,pr->value);
pr=pr->next;
}
}
}
/*删除相同结点*/
voidlist_plicate_delete(list_t*l){
if(&l->head!=l->tail){
node_t*p=l->head.next,*last,*t;
intvalue=p->value;

last=p;
p=p->next;
while(p){
if(value==p->value){
t=p;
last->next=p->next;
p=p->next;
free(t);
}else{
value=p->value;
last=p;
p=p->next;
}
}
}
}
/*打印链表*/
voidlist_show(char*name,list_t*l){
node_t*p=l->head.next;
printf("%s:",name);
for(;p;p=p->next){
printf("%d,",p->value);
}
printf(" ");
}
/*主函数*/
voidmain(){
list_tlist1,list2,list3;
inta[]={10,4,6,12,1,8,14,10,14,6};
intb[]={7,11,6,1,13,5,1,14};

/*所有链表需要初始化后才能使用*/
list_init(&list1,a,sizeof(a)/sizeof(int));
list_init(&list2,b,sizeof(b)/sizeof(int));
list_init(&list3,NULL,0);

printf("初始值: ");
list_show("List1",&list1);
list_show("List2",&list2);
list_show("List3",&list3);

/*合并链表*/
list_merge(&list1,&list2,&list3);
printf("合并后: ");
list_show("List1",&list1);
list_show("List2",&list2);
list_show("List3",&list3);

/*去重复*/
list_plicate_delete(&list3);
printf("去重复后: ");
list_show("List1",&list1);
list_show("List2",&list2);
list_show("List3",&list3);

/*所有链表都需要释放空间*/
list_clear(&list1);
list_clear(&list2);
list_clear(&list3);
}

//这可是血汗钱啊.....

⑽ C语言链表尾插法建立,非常需要大家帮忙

你的代码看着不太习惯……而且……按说应该自己报错才对……

先说我觉得的核心:
addnode函数里,你while循环终止时,t是指向Null的,然后t直接就被指向了一个新开的空间,和你前面的链表完全没有联系……

改进:
1,加的时候应该判断一下,因为你建立头指针的时候,如果还没有元素,这个add的位置就应该是l->Next=(lnode *)malloc(sizeof(lnode)),如果已经有元素,那么需要找到末尾的那个元素(也就是t->Next==Null),然后是t->Next=(lnode *)malloc(sizeof(lnode))
也就是按你目前改的话,addnode中需要:
void addnode(linklist *l, int x){
if((*l)->count==0)
{
(*l)->next=(lnode *)malloc(sizeof(lnode));
(*l)->next->NULL;
(*l)->data=x;
(*l)->count++;
return;
}
lnode *t=l->next;
while(t->next!=NULL) t=t->next;
t->next=(lnode*)malloc(sizeof(lnode));//一定先开启空间,有了下一个节点的地址,再指过去,不能t已经到空了,让t=,那是直接把t挪走,而不是让链表连接起来了
t->next->next=NULL;
t->next->data=x;
(*l)->count++;
return;
}

其实更建议定义一个新的函数叫创建节点,应该能让程序更清晰
lnode* createNode(int data)
{
lnode* node=(lnode*)malloc(sizeof(lnode));
node->data=data;
node->next=NULL;
return node;
}
这样的话,你的添加节点应该能更好理解,代码我不写了,逻辑为:
添加节点(链表l,数值x){
如果头指针下没有元素
{头指针下的元素指向一个新创建的元素(*l)->next=createNode(x);
头指针元素计数加1;
返回
}
声明新的节点指针t;
如果t不是最后一个元素(这里务必注意:条件应是t->next==NULL,而不是t==NULL),让t指向其下一个节点并循环;
t的下一个节点指向一个新创建的指针(t->next=createNode(x);
l的计数加一;
}

PS:
linklist在声明的时候已经定义成了headnode的指针,为什么在初始化时候要(*l)=...呢?
l=(linklist *)malloc(sizeof(headnode))应该就好了吧,目的是开一个空间,并让l指过去