C言語チェーン構造[逆順](データ構造)

チェーン構造-ヘッド挿入方法-逆順

  • 単一リンクリスト(ヘッド挿入メソッド)を作成するには、
    ヘッド挿入メソッドはリンクされたリストのヘッドに新しいノードをそれぞれ挿入するため、入力の逆の順序になります。これらの2つの関数はヘッド挿入とテール挿入で、メイン関数の呼び出しをテール挿入に変更できます。

データ構造

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct node{
    
    
ElemType data;
struct node *next;
} Node, *LinkList;
/*链表的初始化*/
LinkList init(){
    
    
LinkList p;
p=(LinkList)malloc(sizeof(Node));
p->next=NULL;
return p;
}
/*求表长*/
int len(LinkList H){
    
    
int len=0;
LinkList p;
for(p=H->next; p; p=p->next) len++;
return len;
}
/*头部插入法*/
void f_insert(LinkList H,ElemType s){
    
    
LinkList p,q;
p=(LinkList)malloc(sizeof(Node));
p->next=NULL;
p->data=s;
p->next=H->next;
H->next=p;
}
/*尾部插入法*/
LinkList r_insert(LinkList H,ElemType s){
    
    
LinkList p,q;
for(q=H; q->next; q=q->next);
p=(LinkList)malloc(sizeof(Node));
p->next=NULL;
p->data=s;
q->next=p;
return p;
}
/*删除p指向的结点*/
void dele(LinkList H,LinkList p){
    
    
LinkList q;
for(q=H; q->next!=p; q=q->next);
q->next=p->next;
free(p);
}
/*按值查找*/
LinkList search_val(LinkList H,ElemType s){
    
    
LinkList p;
for(p=H->next; p; p=p->next)
if(p->data==s)
return p;
return NULL;
}
/*按序号查找,序号从1开始*/
LinkList search_no(LinkList H,int pos){
    
    
LinkList p;
int i=1;
if(pos<=0 || pos>len(H))
{
    
    
printf("输入的序号不合法!\n");
return NULL;
}
for(p=H->next; i!=pos; p=p->next)i++;
return p;
}
/*输出所有链表值*/
void print_all(LinkList H)
{
    
    
LinkList p;
for(p=H->next; p; p=p->next)
printf("%d ",p->data);
printf("\n");
}
/*在单链表H的第pos个结点前插入值为e的结点,pos从1开始*/
int insert(LinkList H,int pos,ElemType e)
{
    
    
LinkList p,q;
if(pos>len(H) || pos<1)
{
    
    
printf("输入的位置不合法\n");
return 0;
}
else if(pos==1) f_insert(H,e);
else
{
    
    
p=search_no(H,pos-1);
q=(LinkList)malloc(sizeof(Node));
q->data=e;
q->next=p->next;
p->next=q;
}
return 1;
}
/*递增有序链表La,Lb合并为Lc*/
void merge(LinkList La,LinkList Lb,LinkList *Lc)
{
    
    
LinkList pa,pb,pc;
pa=La->next;
pb=Lb->next;
(*Lc)=pc=La;/*pc总是指向生成的单链表的最后一个结点*/
while(pa && pb)
{
    
    
if(pa->data <= pb->data)
{
    
    
pc->next = pa; /*将pa连接到pc之后*/
pc = pa;
pa = pa->next;
}
else
{
    
    
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
/*La单链表还有结点时,剩余结点放在pc后,否则Lb剩余结点放在pc后*/
pc->next = pa? pa:pb;
}
void destroy(LinkList H)
{
    
    
LinkList p=H,q=p->next;
while(q)
{
    
    
free(p);
p=q;
q=p->next;
}
free(p);
}
int main()
{
    
    
LinkList H,Ha,Hb,Hc,p;
int n,menu,i;
ElemType e;
H=init();/*初始化带头结点的单链表,头指针为H,*/
Ha=init();/*初始化带头结点的单链表,头指针为Hb,*/
Hb=init();/*初始化带头结点的单链表,头指针为Ha,*/
do/*菜单*/
{
    
    
printf("\n\n*******************单链表操作*******************\n");
printf("1.构建单链表(头部插入法)\n");
printf("2.输出单链表各值\n");
printf("3.输出单链表表长\n");
printf("4.向单链表插入结点\n");
printf("5.删除单链表某结点\n");
printf("6.按序号查找单链表结点\n");
printf("7.归并有序单链表\n");
printf("8.退出程序\n");
printf("输入菜单号码:\n");
scanf("%d",&menu);
switch(menu)
{
    
    
case 1:
destroy(H);
H=init();
printf("输入要插入结点个数:\n");
scanf("%d",&n);
printf("输入要插入的%d个结点值,各值用空格分隔:\n",n);
for(i=0; i<n; i++)
{
    
    
scanf("%d",&e);
f_insert(H,e);/*在链表H头部插入值e*/
}
printf("单链表创建成功!\n");
Sleep(500);
system("cls");
break;

case 2:
printf("链表各元素为:\n");
print_all(H);
system("pause");
system("cls");
break;

case 3:
printf("单链表表长为%d\n",len(H));
system("pause");
system("cls");
break;

case 4:
printf("输入插入的位置:\n");
scanf("%d",&n);
printf("输入插入的元素值:\n");
scanf("%d",&e);
if(insert(H,n,e))
{
    
    
printf("插入元素%d后各值为:\n",e);
print_all(H);
}
system("pause");
break;

case 5:
printf("输入要删除的元素值\n");
scanf("%d",&e);
if((p=search_val(H,e))!=NULL)
{
    
    
dele(H,p);
printf("删除元素%d后各值为:\n",e);
print_all(H);
}
else printf("元素%d不存在!\n",e);
system("pause");
break;

case 6:
printf("输入要查找的元素序号:\n");
scanf("%d",&n);
if((p=search_no(H,n))!=NULL)
printf("链表第%d个元素为:%d\n",n,p->data);
system("pause");
break;

case 7:
destroy(Ha);
destroy(Hb);
Ha=init();
Hb=init();
printf("输入有序单链表Ha结点个数:\n");
scanf("%d",&n);
printf("输入有序单链表Ha的%d个结点值,各值用空格分隔:\n",n);
for(i=0; i<n; i++){
    
    
scanf("%d",&e);
r_insert(Ha,e);/*在链表Ha尾部插入值e*/
}
printf("输入有序单链表Hb结点个数:\n");
scanf("%d",&n);
printf("输入有序单链表Hb的%d个结点值,各值用空格分隔:\n",n);
for(i=0; i<n; i++){
    
    
scanf("%d",&e);
r_insert(Hb,e);/*在链表Hb尾部插入值e*/
}
merge(Ha,Hb,&Hc);
printf("合并后的有序单链表各值为:\n");
print_all(Hc);
system("pause");
break;

case 8:
destroy(H);/*删除链表H*/
destroy(Ha);/*删除链表Ha*/
destroy(Hb);/*删除链表Hb*/
return 0;
default:
printf("输入的菜单号有误!\n");
system("pause");
break;
}
}

while(1);
return 0;}

おすすめ

転載: blog.csdn.net/GodOuO/article/details/107309596