当前位置: 代码迷 >> 综合 >> 《数据结构》实验报告(二)链表的基础操作
  详细解决方案

《数据结构》实验报告(二)链表的基础操作

热度:103   发布时间:2023-11-25 05:00:43.0
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int DataType;
typedef struct Node
{
    DataType Data;struct Node*Next;
}Node;
typedef struct Node *LinkList;
int InitList(LinkList *L)							//带有头节点的单链表的初始化
{
    (*L) = (LinkList)malloc(sizeof(Node));if (!L){
    printf("分配内存失败!\n");exit(0);}(*L)->Next = NULL;return 0;
}
int ListEmpty(LinkList PHead)//判断链表是否为空
{
    return PHead->Next==NULL;
}
void CreatFormHead(LinkList PHead)//头插法建表
{
    DataType data;Node *s;//要插入的节点指针scanf("%d",&data);while(data!=-1)//输入要插入的值为-1作为结束标志{
    s=(Node*)malloc(sizeof(Node));s->Data=data;s->Next=PHead->Next;PHead->Next=s;scanf("%d",&data);}
}
void CreatFormTail(LinkList PHead)//尾插法建表
{
    Node*s;Node*tail;DataType data;tail = PHead;scanf("%d",&data);while(data!=-1){
    s=(Node*)malloc(sizeof(Node));s->Data=data;s->Next=tail->Next;tail->Next=s;tail=s;//tail始终指向表尾scanf("%d",&data);}
}
Node*Get(LinkList PHead,int i)//查找第i个元素
{
    Node*p;//结点指针int j=0;p=PHead;if(ListEmpty(PHead)){
    printf("表为空!\n");return 0;}while(!ListEmpty(PHead)&&j<i){
    p=p->Next;j++;}if(j==i){
    return p;//返回指向第i个节点的指针p*;}return NULL;
}
int Locate(LinkList PHead,DataType data)//按值查找元素位置
{
    Node*p=PHead->Next;int i=1;while(p){
    while(p->Data!=data){
    p=p->Next;i++;}break;//招待节点退出循环}return i;
}
int length(LinkList PHead)//求链表长度
{
    Node *p;p=PHead;int len=0;while(p->Next!=NULL){
    len++;p=p->Next;}return len;
}
void InsList(LinkList PHead,int i,DataType data)
{
    Node*p;Node*s;p=PHead;int j=0;while(p->Next!=NULL&&j<i-1){
    p=p->Next;j++;}if(p==NULL){
    return;//插入不合法}s=(Node*)malloc(sizeof(Node));//创建一个节点s->Data=data;s->Next=p->Next;p->Next=s;
}
int DelList(LinkList PHead,int i,DataType*data)//删除操作
{
    Node*p;Node*s;p=PHead;int k=0;if(i<0||i>length(PHead)){
    printf("删除位置不合法!\n");return 0;}while(p->Next!=NULL&&k<i-1){
    p=p->Next;k++;}s=p->Next;*data=s->Data;p->Next=s->Next;free(s);return *data;
}
void DestoryList(LinkList PHead)//销毁链表
{
    Node*p;Node*q;p=PHead;while(p->Next!=NULL){
    q=p;p=p->Next;free(q);}
}
void PrintList(LinkList PHead)
{
    Node*p;p=PHead->Next;while(p){
    printf("%d",p->Data);p=p->Next;}printf("\n");
}
/*void InitList(LinkList*PHead);int ListEmpty(LinkList PHead);void CreatFormHead(LinkList PHead);void CreatFormTail(LinkList PHead);Node*Get(LinkList PHead,int i);int Locate(LinkList PHead,int i);int length(LinkList PHead);void InsList(LinkList Phead,int i,DataType data);int DelList(LinkList PHead,int i,DataType*data);void DestoryList(LinkList PHead);void PrintList(LinkList PHead);*/
int main()
{
    LinkList L;LinkList L1;DataType data;int num;int val;InitList(&L);InitList(&L1);printf("头插法建表(L1)\n");CreatFormHead(L1);printf("表中元素有\n");PrintList(L1);printf("\n");printf("尾插法建表(L)\n");CreatFormTail(L);printf("链表中的元素有\n");PrintList(L);printf("\n");printf("在聊表中插入一个元素\n");printf("请输入要插入的位置\n");scanf("%d",&num);printf("请输入插入的元素值:\n");scanf("%d",&val);InsList(L,num,val);printf("链表中的元素有\n");PrintList(L);printf("\n");printf("删除链表中的元素\n");printf("请输入删除的位置\n");scanf("%d",&num);DelList(L,num,&data);printf("删除元素的值为%d\n",data);printf("\n");printf("链表中的元素有: \n");PrintList(L);printf("\n");printf("链表长度为:%d \n",length(L));printf("\n");printf("输入要查找的元素序号\n");scanf("%d",&num);Node* p=Get(L,num);printf("第%d个元素的值为 %d\n",num,p->Data);printf("请输入要查找的元素值\n");scanf("%d",&val);printf("%d在表中的位置序号为%d\n",val,Locate(L,val));printf("\n");return 0;
}

参考《数据结构实验报告》