试用C语言编写程序,连接任意两个链表.

试用C语言编写程序,连接任意两个链表.,第1张

//如果是单链表

struct NODE{

int data;

NODE next;

};

void link_list(NODE list1, NODE list2){

NODE p, tail;

for(p=list1, tail=NULL; p; tail=p,p=p->next){}

if(tail)

tail->next = list2;

} //如果是双链表

struct NODE{

int data;

NODE next;

NODE prev;

}; void link_list(NODE list1, NODE list2)

{

NODE p, tail;

for(p=list1, tail=NULL; p; tail=p,p=p->next){}

if(tail && list2){

tail->next = list2;

list2->prev = tail;

}

}

俺给你的那个程序本来就能用啊,只是临界区忘记初始化了哈。

把初始化函数改一下即可。

NodeList(){

mHead=NULL;

mName[0]='\0';

InitializeCriticalSection(&g_cs);

}

#include<stdioh>

#include<stdlibh>

#include<malloch>

typedef struct node

{

int a;//data,懒得改了

struct node prior,next;

}Lnode,Linklist;

Linklist creat(int node_number)

{

if(node_number<1)

return NULL;

Linklist L=NULL;//Head of Linklist

Linklist s,r=NULL;

int x;

printf("请输入链表数据:\n");

scanf("%d",&x);

s=malloc(sizeof(Lnode));

L=s;

s->a=x;

s->prior=NULL;

s->next=NULL;

while(--node_number)

{

scanf("%d",&x);

r=malloc(sizeof(Lnode));

r->a=x;

r->prior=s;

r->next = NULL;

s->next = r;

s = r;

}

return L;

}

Linklist insert(Linklist L,int n)

{

Lnode s,q;

int x;

printf("请输入要插入的数据:\n");

scanf("%d",&x);

if(n==0)

{

s=malloc(sizeof(Lnode));

s->a=x;

s->next=L;

s->prior = NULL;

L=s;

return L;

}

else

{

q=L;

while( (q->next!=NULL) && n>1)

{

q=q->next;

n--;

}

if(n==1)

{

s=malloc(sizeof(Lnode));

s->a=x;

s->next=q->next;

(q->next)->prior = s;

s->prior = q;

q->next=s;

}

else printf("链表插入错误!\n");

return L;

}

}

Linklist delete(Linklist L)//使用关键字

{

Lnode s,q;

int x;

printf("请输入要删除的数据:\n");

scanf("%d",&x);

q = L;

while(q)

{

if(q->a == x)

break;

q=q->next;

}

if(q==NULL)

{

printf("链表中未有该数据\n");

}

else{

s=q->prior;

if(s)

s->next=q->next;

if(q->next)

(q->next)->prior = s;

free(q);

}

return L;

}

void Linklist_print(Linklist p)

{

printf("链表数据输出:\n");

while(p!=NULL)

{

printf(" %6d",p->a);

p=p->next;

}

printf("\n");

}

int main()

{

Linklist L;

L=creat(10);//10个元素

Linklist_print(L);

int n;

printf("\n输入插入节点的位置:\n");

scanf("%d",&n);

L=insert(L,n);

Linklist_print(L);

delete(L);

Linklist_print(L);

return 0;

}

在创建是有个s没有初始化空间。

/创建一个双向链表/

void creatLinklist_Du(duLinklist &L,int n)

{

duNode p;

initLinklist_Du(L);

p=L;

int i;

for(i=0;i<n;i++)

{

duNode s=new duNode;//初始化问题

cin>>s->data;

s->next=L;

s->prior=p;

p->next=s;

L->prior=s;

p=s;

}

}

lz的这个问题是一个很容易让人迷糊的问题。我来解释一下:

struct

node

{

struct

node

prev;

struct

node

next;

}p,

q;

//

这里指针p和q的赋值 *** 作省去

q->prev

=

p->prev;

//

--

1

q->next

=

p;

//

--

2

p->prev->next

=

q;

//

--

3

p->prev

=

q;

//

--

4

这里因为没有存下p的前一个指针,所以有顺序要求:

1

语句4必须在1和3之后。(因为4中将p->prev赋新值之后,就无法得到原来p前的那个节点,所以这句留在最后)

2

其他顺序任意。

以上就是关于试用C语言编写程序,连接任意两个链表.全部的内容,包括:试用C语言编写程序,连接任意两个链表.、C语言线程安全型双向链表的实现、求一用C++写的线性表链式存储(双向链表)插入、删除运算的程序!!!急!!!谢谢!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zz/10108524.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存