数据结构—单链表的部分基本操作(C语言)

来源:互联网 发布:知网查重数据库 编辑:程序博客网 时间:2024/05/17 20:33
************************************
*文件名:status.h
*描述:基本全局变量的头文件
*************************************/
#ifndef STATUS_H
#define STATUS_H

#define OK 1

#define OVERFLOW -2

#define ERROR 0

#define TRUE 1

#define FALSE 0

#define NULL 0

typedef  int  Status;

typedef  unsigned int size_t;

#endif


/************************************
*描述:实现单链表的创建InitList_Link、打印PrintList_Link、插入ListInsert_Link、删除ListDelete_Link、定位LocateElem_Link等基本操作,然后求:
将两个带有表头结点的有序单链表La、Lb,编写出将La、Lb合并成一个有序链表Lc的算法。
*************************************/

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include"status.h"


typedef int ElemType;

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


Status CreateList(LinkList *L,int n)//创建一个带头结点,长度为n(头结点不包含在内)的单链表
{
int i;
LinkList p,q;
ElemType c;
p=(LinkList)malloc(sizeof(LNode));
p->next=NULL;
*L=q=p;/*???*/
printf("请输入数据");
for(i=n;i>0;i--)
{
p=(LinkList)malloc(sizeof(LNode));
c=getche();
p->data=c;
p->next=NULL;
q->next=p;
q=p;
}
return OK;
}


Status Init(LinkList *L)   /*初始化一个链表*/
{
  int n;
  printf("Please input the number of the node : ");
  scanf("%d", &n);
  CreateList(L, n);
  return OK;
}


void Printlk(LinkList L)/*打印输出线性表*/
{
LinkList p;
p=L->next;
printf("\n");
while(p)
{
printf("%c  ",p->data);
p=p->next;
}
printf("NULL\n");/*最后输出一个NULL????*/
}


Status InsertList(LinkList L,int i,ElemType e)/*将元素e插入到第i个元素之前,e成为第i个元素*/
{
LinkList p,s;
int j;
p=L;
j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)return ERROR;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}


Status Insert(LinkList L) /*接收插入数据,调用插入操作*/
{
int i;
ElemType  data;

printf("Please input the position : ");
scanf("%d",  &i);
printf("Please input the data : ");
data = getche();
InsertList(L,i,data);
return OK;
}


Status ListDelete(LinkList L,int i)/*删除第i个元素,由e返回其值*/
{
ElemType e;
LinkList p,q;
p=L;
int j=0;
while(p->next&&j<i-1)
{
p=p->next;
++j;
}
if(!(p->next)||j>i-1)return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
}


Status Delete(LinkList L)//接收需要删除的数据,进行删除操作
{
int i;
printf("Please input the position : ");
scanf("%d",  &i);
ListDelete(L,i);
return OK;
}






void MergeList(LinkList L1, LinkList L2, LinkList L3)//已知La Lb按非递减顺序排列
{
LinkList  pa, pb, pc;//合并后Lc按非递减顺序排列
pa=L1->next;pb=L2->next;//pa,pb分别指向第一个结点
pc=L3;
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;
L1->next=NULL;  
L2->next=NULL;  
}


void  MenuList( )
{
printf("\n\n1:插入数据到La \n2:插入数据到Lb \n3:删除La中的元素 \n4:删除Lb中的元素 \n5:合并La Lb,并打印合并后的新线性表 \n6:打印La,Lb \n7:退出\n");
}




void MenuSelect(LinkList La,LinkList Lb)
{
int select, done=1;
LinkList  Lc;
while (done) {
    MenuList( );
    printf("input the operating code : ");
    scanf("%d", &select);
switch(select)
{
case 1: Insert(La);break;
case 2: Insert(Lb);break;
case 3: Delete(La);break;
case 4: Delete(Lb);break;
case 5: CreateList(&Lc, 0);MergeList(La, Lb, Lc);
    printf("LC:   ");Printlk(Lc); break;
case 6: printf("LA:  ");Printlk(La);
    printf("LB:  ");   Printlk(Lb);break;
case 7: done=0;      break;
default: printf(" ERROR\n");  }
   }
}


int main()
{
LinkList La,Lb;
printf("La\n");
Init(&La);
Printlk(La);
printf("Lb\n");
Init(&Lb);
Printlk(Lb);
MenuSelect(La,Lb);
return 0;
}

初学者不入行家法眼,望指正。


原创粉丝点击