设计一个单链表基本操作的程序
#include
#include
#define N 10 //顺序表的最大容量
int length=0; //顺序表的当前元素个数
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100//线性表存储的空间初始化分配量
#define LISTINCREAMENT 10 //线性表存储空间的分配增量
typedef struct LNode//线性单链表存储结构
{
int data;
struct LNode *next;
}LNode,*LinkList;
int CreatList_L(LinkList&L)//创建一个线性链表
{
L=(LinkList)malloc(sizeof(LNode));//分配一个空间给链表,作为头结点
if(!L) exit(OVERFLOW);
L->next=NULL;
return OK;
}
int DestroyList_L(LinkList &L)//销毁链表
{
if(L) free(L);
return OK;
}
int ListInsert_L(LinkList&L,int i,int e)//再练表的第i个元素前插入一个元素e
{
LinkList p=L;//p指针定位于i-1
LNode *s;
int j=0;
while(p&&jnext;j++;}//定位
if(!p||j>i-1) return ERROR;//如果i<1或大于链表元素个数+1
s=(LNode*)malloc(sizeof(LNode));
if(!s) exit(OVERFLOW);
s->data=e; //完成插入操作
s->next=p->next;
p->next=s;
return OK;
}
int ListDelet_L(LinkList&L,int i,int&e)//删除链表L中的第i个元素,并返回给e;
{
LinkList p=L;
LNode* q;
int j=0;
while(!p&&jnext;j++;}//p指针定位于i-1;
if(!p->next||j>i-1) return ERROR;
e=p->next->data; //完成删除操作
q=p->next;
p->next=p->next->next;
free(q);
return OK;
}
int ListTraverse_L(LinkList L,int n)//链表的遍历
{
int i=0;
if(!L)return ERROR;
L=L->next;
while(L)
{
if(L->data==n)return i;
L=L->next;
i++;
}
return FALSE;
}
int InverseSingleList_L(LinkList &L)
{
if(!L->next||!L->next->next)//如果链表少于2个Node那么链表不需要改变顺序
return OK;
LNode *p,*q;
p=L->next; //第一次因为p是最后一个连接所以把p->next设为空
q=p->next;
p->next=NULL;
p=q;
while(p)
{
q=p->next; //用q去保留p后面一个Node;
p->next=L->next;
L->next=p;
p=q;
}
return OK;
}
int main()
{
int List[N];
LinkList L;
int ch,exit='N';
do
{
system("CLS");
printf("********************************************
");
printf("* 1.创建一个顺序表 .........(1) *
");
printf("* 2.在顺序表中查找元表.........(2) *
");
printf("* 3.在顺序表中插入元表.........(3) *
");
printf("* 4.在顺序表中删除元表.........(4) *
");
printf("* 5.退出 .........(5) *
");
printf("********************************************
");
printf("
请选择操作代码:");
ch=getchar();
switch(ch)
{
case '1':
printf("
请输入十个元素");
CreatList_L(L);
for(length=0;length<N;length++)
{
scanf("%d",&List[length]);
getchar();
ListInsert_L(L,length+1,List[length]);
}
printf("
创建成功!");
getchar();
break;
case '2':
scanf("%d",&List[0]);
if(ListTraverse_L(L,List[0]))printf("该元素存在该年表的第%d个位置",ListTraverse_L(L,List[0]));
else printf("不存在该元素");
getchar();
break;
case '3':
scanf("%d%d",&length,&List[0]);
ListInsert_L(L,length,List[0]);
system("pause");
break;
case '4':
scanf("%d",&length);
ListDelet_L(L,length,List[0]);
system("pause");
break;
case '5':
printf("
您是否真的要退出程序(Y/N):");
getchar();
exit=getchar();
break;
default:
getchar();
printf("
无效输入,请重新选择...:");
getchar();
break;
}
}while(exit!='y'&&exit!='Y');
}
typedef int Elemtype;
typedef int status;
#define OVERFLOW -2
#define OK 1
#define ERROR -1
#include "stdio.h"
#include "stdlib.h"
typedef struct LNode {
Elemtype data;
struct LNode *next;
}*linklist;
//构造链表
void Create_Linklist(linklist &L)
{
linklist p;
p=(linklist)malloc(sizeof(LNode));
if(!p)
exit(OVERFLOW);
L=p;
L->next =NULL;
}
//节点插入
void Insert_Linklist(linklist &L)
{
linklist p;
int n,i;
printf("请输入插入节点的个数n: ");
scanf("%d",&n);
getchar();
for(i=n;i>0;i--)
{
p=(linklist )malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next ;
L->next =p;
}
}
//遍历输出并输出长度
status Visit_linklist(linklist &L)
{
linklist p;
int i=1;
p=L->next ;
if(L->next==NULL)
return ERROR;
while(p->next !=NULL)
{
printf("%d ",p->data );
p=p->next ;
i++;
}
printf("%d
",p->data );
printf("长度为:%d
",i);
return OK;
}
//查找值为x的直接前驱结点q并输出
void Search_linklist(linklist &L)
{
int x,k=0;
linklist p=L,q;
printf("输入x: ");
scanf("%d",&x);
getchar();
if(L->next ==NULL)
printf("该表为空 !
");
while(p->next!=NULL)
{
q=p;
if(p->next ->data ==x)
{
printf("%d ",q->data );
k=1;
}
p=p->next ;
}
if(p->next &&p->data ==x)
{
printf("%d ",p->data );
k=1;
}
if(k==0)
printf("未找到值为%d的结点
",&x);
printf("
");
}
//删除节点
status Delete_linklist(linklist &L)
{
linklist p,q;
int k=0,x;
printf("请输入删除节点的值x: ");
scanf("%d",&x);
getchar();
if(L->next ==NULL)
return ERROR;
p=L;
q=L->next ;
while(q!=NULL)
if(q->data ==x)
{
k=1;
p=q ;
p->next =q->next ;
free(q);
q=p->next ;
}
else
{
p=q ;
q=p->next ;
}
if(k==0)
printf("表中没有值为%d的结点!
",&x);
return OK;
}
//链表逆置
void ListInverse_linkliast(linklist &L)
{
linklist k,p,q;
p=L;
while (p->next !=NULL)
{
p=p->next ;
}
k=p;
while (L->next !=p)
{
q=L->next ;
L->next = q->next ;
k->next =q;
}
}
//链表奇偶分解
void Break_linklist (linklist &La,linklist &Lb)
{
linklist p,q;
p=La->next;
q=Lb;
while(p->next!=NULL)
{
if(p->data %2==0)
{
q->next =p;
q=q->next ;
}
p=p->next ;
}
if(p->data %2==0)
{
q->next =p;
q=q->next ;
}
}
//主菜单
void main()
{
linklist L1,L2;
printf(" (1) 建立带头节点的单链表
");
printf(" (2) 插入节点
");
printf(" (3) 计算链表长度并输出单链表
");
printf(" (4) 查找值为x的直接前驱结点并输出其值
");
printf(" (5) 删除节点值为x的结点
");
printf(" (6) 逆置单链表结点
");
printf(" (7) 单链表奇偶分解
");
int choice;
printf(" 请输入选择:");
while(scanf("%d",&choice))
{
getchar();
printf("
");
switch(choice)
{
case 1:
Create_Linklist(L1);
break;
case 2:
Insert_Linklist(L1);
break;
case 3:
Visit_linklist(L1);
break;
case 4:
Search_linklist(L1);
break;
case 5:
Delete_linklist(L1);
break;
case 6:
ListInverse_linkliast(L1);
break;
case 7:
Create_Linklist(L2);
Break_linklist (L1,L2);
break;
default:
printf(" 输入有误!");
break;
}
}
}
using namespace std;
typedef struct node
{
char data;
struct node *next;
}link;
link * get(link *l, int i)
{
link *p;int j=0;
p=l;
while((j<i) && (p->next!=NULL))
{p=p->next;j++;}
if(j==i)
return p;
else
return NULL;
}
link * ins (link *l, char ch,int i)
{ link *p,*s;
p=get(l,i-1);
if(p==NULL)
cout<<"输入有误"<<endl;
else
{
s=(link *)malloc(sizeof(link));
s->data=ch;
s->next=p->next;
p->next=s;
}
return l;
}
link * find(link *l, char ch)
{
link *p; int i=0; int j=0;
p=l;
while(p!=NULL)
{ i++;
if(p->data!=ch)
p=p->next;
else {cout<<"您查找的数据在第"<<i-1<<"个位置."<<endl;
j=1;p=p->next;
}
}
if(j!=1)
cout<<"您查找的数据不在线性表中."<<endl;
return l;
}
link * del(link *l, int i)
{
link *p,*s;
p=get(l,i-1);
if(p==NULL)
cout<<"输入有误"<<endl;
else
{
s=p->next;
p->next=s->next;
free(s);
}
return l;
}
link * add(link *l )
{
link *p,*s;
cout<<"请输入一串单字符数据,以*结束!"<<endl;
char ch;
link *HEAD;
link *R,*P,*L;
HEAD=(link *)malloc(sizeof(link));
HEAD->next=NULL;
R=HEAD;
getchar();
ch=getchar();
while(ch!='*')
{
P=(link *)malloc(sizeof(link));
P->data=ch;P->next=NULL;
R->next=P;R=R->next;
getchar();
ch=getchar();
}
L=HEAD;
cout<<"当前输入的线性表为:"<<endl;
P=L;P=P->next;
if(L!=NULL)
do
{cout<<P->data<<" ";
P=P->next;
}while(P!=NULL);
cout<<endl;
p=l;
while(p->next!=NULL)
p=p->next;
s=L;
p->next=s->next;
p=l;
return l;
}
link * print(link *l)
{ int i,k;
char ch;
link *p,*q;
cout<<"当前线性表为:"<<endl;
p=l;p=p->next;
if(l!=NULL)
do
{cout<<p->data<<" ";
p=p->next;
}while(p!=NULL);
cout<<endl;
cout<<"请选择您要的操作:";
cout<<" 1、插入";
cout<<" 2、查找";
cout<<" 3、删除";
cout<<" 4、合并";
cout<<" 0、退出";
cout<<endl;
cin>>k;
if(k==1)
{
cout<<"请输入您要插入的数据值:";
cin>>ch;
cout<<"请输入您要插入的位置:";
cin>>i;
p=ins(l,ch,i);
q=print(l);
}
else if(k==2)
{
cout<<"请输入您要查找的数据值:";
cin>>ch;
p=find(l,ch);
q=print(l);
}
else if(k==3)
{
cout<<"请输入您要删除的数据的位置:";
cin>>i;
p=del(l,i);
q=print(l);
}
else if(k==4)
{ p=add(l);
q=print(l);
}
else if(k==0)
;
else
{cout<<"输入错误!"<<endl;
q=print(l);}
return l;
}
int main()
{
cout<<"请输入一串单字符数据,以*结束!"<<endl;
char ch;
//link *head;
link *r,*p,*q,*l;
l=(link *)malloc(sizeof(link));
l->next=NULL;
r=l;
ch=getchar();
// getchar();
while(ch!='*')
{
p=(link *)malloc(sizeof(link));
p->data=ch;p->next=NULL;
r->next=p;r=r->next;
ch=getchar();
// getchar();
}
//l=head;
q=print(l);
return 0;
}
数据结构课程单链表实验报告
郑州轻工业学院《数据结构》课程实验实验报告题目:单链表表的基本操作及c语言实现专业:信息管理与信息系统班级:11-01姓名:高博文完成日期:2013\/5\/23一、试验内容用c语言实现单链表的建立插入删除查找,合并等内容二、试验目的掌握链表的基本操作:插入、删除、查找等运算,能够灵活应用链表这种数据结构...
在一个单链表中的p所指结点之前插入一个s所指结点时,可执行如下操作...
q=head;while(q && q->next!dao=p){ q=q->next;}\/\/循环结束时q后面正好zhi是需要找的dp或者q为空表示链版表中没有权p if (q){ s=new node;s->data =e;q->next = s;s->next = p;} q->next表示结点中存放的指针,该指针用来指向某个结点。原来的连接关系是q->next=p,意思...
在一个单链表中P所指结点之后插入一个s所指结点时,应执行s->next= p...
现在存在一个单向链表,指针p指向该链表中的某个结点,“p->next”表示p所指向结点的下一个结点。同时还有一个孤立的结点由指针s指向。现在要把s指向的结点插入到p指向结点的后方,使其加入到单向链表中,其过程可以参考下图。步骤一:步骤二:步骤三:最后,把链表拉直,可以看到,已经完成插入操作,...
C语言单向链表的创建,输入,插入和删除的实现
\/* 线性表-链表的操作: 只提供核心语句 *\/ include "stdio.h"include "stdlib.h"define N 100 typedef int ElemType;\/* 链表的存储结构 *\/ typedef struct LNode{ ElemType data;struct LNode *next; } LNode,*LinkList;\/* 链表的基本操作 *\/\/*** 1.初始化链表 ***\/ void InitList(L...
...合成一个递减的单链表c,要求使用单链表基本操作,伪代码
node));head->next=NULL;}void input(list &h){list p,q;q=h;printf("输入数据的个数 n : ");int n;scanf("%d",&n);printf("请输入 %d 个有序递增数据:\\n",n);for (int i=0;i<n;i++){\/\/printf("第 %d 个: ",i+1);p=(list)malloc(sizeof(node));scanf("%d",...
急:C++ 单链表的编写
谁能给我个关于单链表的程序要求:实现一个单链表,每个节点是一个学生的信息,能够实现追加、按照指定位置的删除、插入、列表。这是我的作业,哪位能给点思路,或者给点参考程序。... 谁能给我个关于单链表的 程序要求:实现一个单链表,每个节点是一个学生的信息,能够实现追加、按照指定位置的删除、插入、列表。
在一个单链表中,如果要删除最后的一个元素,需要遍历整个链表吗?
则采用仅有尾指针的单循环链表存储方式最节省运。仅有尾指针的单循环链表,可以非常方便地找到尾结点,尾结点后面的第一个结点往往是头结点,头结点的下一个结点就是第线性表的第一个结点。对最后一个元素和第一个元素操作对带尾指针的单循环链表是非常方便的。
一口气玩转链表(C语言版)
如果你对C语言的链表有所了解,那么这篇文章将带你深入掌握链表。本文涵盖链表的基础概念、操作以及高级结构,如双向链表和循环链表。链表基础链表,特别是单链表,是一种逻辑关系为“一对一”的数据结构,与顺序存储不同,它允许元素在内存中分散存储。每个元素都有一个指针指向下一个元素,这样通过指针...
编写程序,建立一个带有节点的单向链表,输入字符串,并按从小到大顺序组织...
为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link))链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。以上内容参考:百度百科-单链表 ...
编程完成一个带头结点的单链表建立,实现初始化、求表长、取元素、按值...
while(p!=NULL&&jnext;j++;} if(j>i-1||p==NULL)return 0;q=p->next;p->next=q->next;e=q->a;free(q);} void main(){ int e,i,n;List l1;struct node *p;printf("请输入要创建链表的大小:\\n");scanf("%d",&n);printf("请向链表中输入%d个整型数据:\\n",n);createLi...
上味大补: typedef int Elemtype;typedef int status;#define OVERFLOW -2#define OK 1#define ERROR -1#include "stdio.h"#include "stdlib.h"typedef struct LNode { Elemtype data; struct LNode *next;}*linklist;//构造链表void Create_Linklist...
谷城县17030022412: 编写一个完整的程序,实现单链表的建立、插入、删除、输出等基本操作.1)建立一个带头结点的单链表.(2)计算单链表的长度,然后输出单链表.(3)查找... - ?
上味大补:[答案] typedef int Elemtype; typedef int status; #define OVERFLOW -2 #define OK 1 #define ERROR -1 #include "stdio.h" #... printf(" (1) 建立带头节点的单链表\n"); printf(" (2) 插入节点\n"); printf(" (3) 计算链表长度并输出单链表\n"); printf(" (4) 查...
谷城县17030022412: 用C语言编程实现单链表的基本操作 - ?
上味大补: 运行结果如下: 完整代码如下: #include<stdio.h> #include<stdlib.h> typedef struct LNode {char data;LNode *next; }* LNodePtr; LNodePtr CreateList() {//初始化头节点LNodePtr head = (LNodePtr)malloc(sizeof(LNode));head->data ...
谷城县17030022412: 用C语言实现对单链表的基本操作 - ?
上味大补: #include <stdio.h> #include <stdlib.h>typedef int DataType;typedef struct node {DataType member;struct node *next; }*LinkList, *pNode;// 初始化链表 LinkList GetEmptyList() {LinkList head = (pNode)malloc(sizeof(struct node));head->...
谷城县17030022412: 编写一个C语言程序 实现单链表的基本操作 - ?
上味大补: #define ListSize 100 typedef int DataType; typedef struct { DataType list[ListSize]; int length; }SeqList; void InitList(SeqList *L) /*将线性表初始化为空的线性表只需要把线性表的长度length置为0*/ { L->length=0; /*把线性表的长度置为0*/ } int ListEmpty...
谷城县17030022412: 编一个程序,实现单链表的基本操作,包括链表的建立、释放、查找、插入、删除等函数,要求同时具备输入输 - ?
上味大补: //输入功能请在调用Insert()之前,自己在main()中设置好入参#include<iostream.h>#include<math.h> const double eps=1e-5;//基类 template<class T> class LinearList { public: virtual bool IsEmpty()const=0; virtual int Length()const=0; virtual ...
谷城县17030022412: 求一份实现单链表的基本操作的c语言程序,包括输入元素,谢谢. - ?
上味大补: #include<stdlib.h>#include "nodedef.h"#define CreateLinklistWay 1 // 0表示头插法创建链表,1表示尾插法创建链表#if !CreateLinklistWay/********************************************************************** 函数名称:linklist *CreateLinklistHead()*...
谷城县17030022412: 请编程实现一个对单链表进行基本操作的系统,主要包括链表的创建,查询,插入,删除,销毁等操作.(要求 - ?
上味大补: #include#include struct node{ int data; struct node *next; }; struct node *creat_linklist() { struct node *head ,*tail,*p;int x; head=tail=NULL; printf("\n请输入一个整数: "); scanf("%d",&x); while(x!=0) { p=(struct node *)malloc(sizeof(struct node)); ...
谷城县17030022412: 编写一个程序 实现单链表的各种基本运算并在此基础上 - ?
上味大补: for(i=1;i<=5;i++) // <= 吧 { if(i == 1) //你写成赋值了 x='A'; else if(i == 2) x='B'; else if(i == 3) x='C'; else if(i == 4) x='D'; else if (i == 5) x='E'; insert(l,x,i); // 滞空 然后依次插入 是不是应该写在循环里 }