您的位置:首页 > 理论基础 > 数据结构算法

数据结构实验一____单链表操作

2015-09-27 18:11 429 查看
实验要求:

1:初始化一个单链表,选择头插法和尾插法均可以。

2:向链表中插入新结点,或者删除某个结点。

3:打印单链表。

4:清空一个单链表。

代码如下:(最好自己写一遍)

#include<stdio.h>
#include<malloc.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
typedef int T;
//单链表的结点结构
typedef struct node* Nodeptr;
typedef struct node
{
T date;          //单链表的数据域
Nodeptr Link;    //单链表的指针域
} Node;
typedef Node* List;  //定义单链表
//创建新链表,尾插
List BuildList1()
{
Node* first,*r;
int n=0,i=0;
T a;
first=(Node*)malloc(sizeof(Node));    //申请表头结点
first->Link=NULL;                   //初始化一个空链表
r=first;                            //r始终指向最后一个结点,开始时指向表头结点
printf("请输入单链表元素的个数:\n");
scanf("%d",&n);
printf("请输入%d个元素:\n",n);
for(i=0; i<n; i++)
{
scanf("%d",&a);
Node* p;
p=(Node *)malloc(sizeof(Node));//申请新的结点
p->date=a;                     //结点数据域赋值
r->Link=p;                     //将结点插入链表尾部
r=p;                           //r始终指向最后一个结点
}
r->Link=NULL;
return first;
}
//创建新链表,头插
List BuildList2()
{
int n,i=0;
Node* first;
T a;
first=(Node*)malloc(sizeof(Node));//申请表头结点
first->Link=NULL;//初始化一个空链表,first始终指向第一个结点
printf("请输入单链表元素的个数:\n");
scanf("%d",&n);
printf("请输入%d个链表元素:\n",n);
for(i=0; i<n; i++)
{
scanf("%d",&a);
Node* p=(Node*)malloc(sizeof(Node));//申请一个新结点
p->date=a;
p->Link=first->Link;
first->Link=p;
}
return first;
}
//输出链表
void PrintList(List first)
{
Node* p;
if(first==NULL)
{
printf("链表为空!\n");
return ;
}
printf("链表如下:\n");
p=first->Link;
while(p!=NULL)
{
printf("%d ",p->date);
p=p->Link;
}
printf("\n");
}
//清空链表
void ClearList(List* first)
{
Node* p=*first;
while(*first)
{
p=(*first)->Link;
free(*first);
*first=p;
}
}

//删除链表中第一个值为X的元素,如果没有X,则什么都不做
void DeleteX(List lst,T X)
{
Node* p=NULL,*tmp;
p=lst;
while(p->Link!=NULL&&p->Link->date!=X)
{
p=p->Link;
}
if(p->Link!=NULL)
{
/*tmp=p->Link;
p->Link=tmp->Link;
free(tmp);*/
p->Link=p->Link->Link;
}
else
{
printf("没有符合条件的结点!\n");
}
}
//在链表的指定元素A后插入B,如果没有A,则插在链表尾部
void InsertB(List lst,T A,T B)
{
Node* p=NULL,*tmp;
p=lst;
tmp=(Node*)malloc(sizeof(Node));
tmp->date=B;
tmp->Link=NULL;
while(p->Link->Link!=NULL&&p->Link->date!=A)
{
p=p->Link;
}
tmp->Link=p->Link->Link;
p->Link->Link=tmp;
/*
if(p->Link!=NULL)
{
tmp->Link=p->Link;
p->Link=tmp;
}
else
{
tmp->Link=p->Link;
p->Link=tmp;
}
*/

}
void main()
{
T a,b;
List lst1,lst2;
lst1=BuildList1();
PrintList(lst1);
printf("请输入你要删除结点的元素(输入-1表示删除结束):");
while(scanf("%d",&a)&&a!=-1)
{
DeleteX(lst1,a);
PrintList(lst1);
}
//PrintList(lst);
ClearList(&lst1);
PrintList(lst1);
lst2=BuildList2();
PrintList(lst2);
printf("请输入A和B:(输入0 0表示插入结束):");
while(scanf("%d%d",&a,&b),a+b)
{
InsertB(lst2,a,b);
PrintList(lst2);
}
ClearList(&lst2);
PrintList(lst2);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: