二工大C语言版数据结构《实验报告2》:单链表

具体题目如下:

cs 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

//单链表的定义:
typedef int DataType;        //DataType可以是任何相应的数据类型如int, float或char

typedef struct node            //结点类型定义
{    DataType data;            //结点的数据域
    struct node *next;        //结点的指针域
}ListNode;

typedef ListNode *LinkList;

int main()
{
    int i;
    DataType key,x;
    LinkList head=NULL;
    
    LinkList CreateList();
    void PrintList(LinkList head);
    void LocateNode(LinkList head,DataType key);
    void InsertList(LinkList head,DataType x,int i);
    void DeleteList(LinkList head,int i);
    void ChangeCircList(LinkList head);
    void PrintCircList(LinkList head);
    char choice;
    while (1)
    {
        system("cls");
        printf("\n\n\n\n");
        printf("\t\t              链表操作  \n");
        printf("\t\t======================================");
        printf("\n\n");
        printf("\t\t             1:建立单链表            \n");
        printf("\t\t             2:显示单链表            \n");
        printf("\t\t             3:查找                  \n");
        printf("\t\t             4:插入                  \n");
        printf("\t\t             5:删除                  \n");
        printf("\t\t             6:改为循环单链表并显示  \n");
        printf("\n");
        printf("\t\t             0:退出        \n");
        printf("\n");
        printf("\t\t请选择:");

        choice = getch();
        system("cls");
        
        switch(choice)
        {
            case '1':
                head=CreateList();
                printf("链表创建成功!\n");
                getch();
                break;
            case '2':
                PrintList(head);
                getch();
                break;
            case '3':
                printf("输入要查找的值:");
                scanf("%d",&key);
                LocateNode(head,key);    //单链表查找
                getch();
                break;
            case '4':                
                printf("请输入欲插入元素的位置:");
                scanf("%d",&i);                
                 printf("请输入欲插入的元素:");
                scanf("%d",&x);
                InsertList(head,x,i);    //单链表插入
                getch();
                break;
            case '5':
                printf("请输入欲删除结点的位置:");
                scanf("%d",&i);
                DeleteList(head,i);        //单链表删除
                break;            
            case '6':
                ChangeCircList(head);    //修改为循环单链表
                PrintCircList(head);    //打印循环单链表
                getch();
                break;
            case '0':
                exit(0);
        }
    }
}

//单链表的建立:
LinkList CreateList()
{
    //在此插入必要的语句
    return head;
}

//单链表的打印:
void PrintList(LinkList head)
{
    //在此插入必要的语句
}

//单链表的查找:
void LocateNode(LinkList head,DataType key)
{
    //在此插入必要的语句
}

//单链表的插入:
void InsertList(LinkList head,DataType x,int i)
{    
    //在此插入必要的语句
}

//单链表的删除:
void DeleteList(LinkList head,int i)
{
    //在此插入必要的语句
}


//修改为循环单链表:
void ChangeCircList(LinkList head)
{
    //在此插入必要的语句
}


//循环单链表的打印:
void PrintCircList(LinkList head)
{
    //在此插入必要的语句
}

需要完成的代码如下:

  1. 从键盘输入10个整数,产生带表头的单链表,并输入结点值。
  2. 从键盘输入1个整数,在单链表中查找该结点。若找到,则显示"找到了";否则,则显示"找不到"。
  3. 从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出单链表所有结点值,观察输出结果。
  4. 从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。
  5. 把单链表变成带表头结点的循环链表,输出循环单链表所有结点值,观察输出结果。

1.单链表的建立与打印

cs 复制代码
//单链表的建立:
LinkList CreateList()
{
	//输入10个数
	int arr[10];
	int i=0;
	for(i=0;i<=9;i++)
	{
		scanf("%d",&arr[i]);
	} 
	
	//创建结点
	LinkList node1 = (LinkList)malloc(sizeof(ListNode));
    node1->data=arr[0];
		LinkList node2 = (LinkList)malloc(sizeof(ListNode));
    node2->data=arr[1];
    	LinkList node3 = (LinkList)malloc(sizeof(ListNode));
    node3->data=arr[2];
    	LinkList node4 = (LinkList)malloc(sizeof(ListNode));
    node4->data=arr[3];
    	LinkList node5 = (LinkList)malloc(sizeof(ListNode));
    node5->data=arr[4];
    	LinkList node6 = (LinkList)malloc(sizeof(ListNode));
    node6->data=arr[5];
    	LinkList node7 = (LinkList)malloc(sizeof(ListNode));
    node7->data=arr[6];
    	LinkList node8 = (LinkList)malloc(sizeof(ListNode));
    node8->data=arr[7];
    	LinkList node9 = (LinkList)malloc(sizeof(ListNode));
    node9->data=arr[8];
    	LinkList node10 = (LinkList)malloc(sizeof(ListNode));
    node10->data=arr[9];
 
 	//链接10个结点 
    node1->next = node2;
    node2->next = node3;
    node3->next = node4;
    node4->next = node5; 
    node5->next = node6;
    node6->next = node7;
    node7->next = node8;
    node8->next = node9;
	node9->next = node10;
    node10->next = NULL;
	
	LinkList head = node1; //让头指针指向第二个结点 
	return head;
}

//单链表的打印:
void PrintList(LinkList head)
{
	LinkList pcur = head; //让head指针依旧指向原结点 
    while (pcur)  //pcur != NULL
    {
        printf("%d->", pcur->data);
        pcur = pcur->next;
    }
    printf("NULL\n");
}

2.单链表的查找

cs 复制代码
	LinkList pcur = head;
	int count=0,flag=0;
	while(pcur)
	{
		count++;
		if(pcur->data==key)
		{
			flag=1;
			printf("找到了!在第%d个结点",count);
		}
		pcur=pcur->next;
	}
	if(flag==0)
	{
		printf("没找到"); 
	}

3.单链表的插入

cs 复制代码
void InsertList(LinkList head,DataType x,int i)
{	
		int j=0;
	LinkList current = head;//从头遍历 
	while(current->next!=NULL)
	{
		j++;//计数,若j=i-1,循环退出
		if (j==i-1)
		{
			break;
		} 
		current = current->next;
	}
	LinkList p = (LinkList) malloc (sizeof (ListNode));//建立新结点
	p->data = x;
	p->next = current->next;
	current->next = p;
}

4.单链表的删除

cs 复制代码
void DeleteList(LinkList head,int i)
{
		int j=0;
	LinkList current = head;//从头遍历 
	while(current->next!=NULL)
	{
		j++;//计数,若j=i-1,循环退出
		if (j==i-1)
		{
			break;
		} 
		current = current->next;
	}
	current->next = current->next->next;
}

5.循环单链表的修改与表示

cs 复制代码
//修改为循环单链表:
void ChangeCircList(LinkList head)
{
	LinkList current = head;
	int j=0; 
	while(current->next!=NULL)//当current下一个非空 
	{
		current = current->next;
		if (current->next==NULL)//如果current下一个为空,说明current到尾部 
		{
			current->next = head;
			break;
		}
	}
}


//循环单链表的打印:
void PrintCircList(LinkList head)
{
	int j,n;
	n=10;
	LinkList current = head;
	for(j=0;j<n;j++)
	{
		printf("%d ",current->data);
		current=current->next;
	}
}

6.全部代码

全部代码是由我和我室友共同思考得出,快和我一起大声说:"谢谢室友!"

cs 复制代码
//单链表的建立:
LinkList CreateList()
{
	//输入10个数
	int arr[10];
	int i=0;
	for(i=0;i<=9;i++)
	{
		scanf("%d",&arr[i]);
	} 
	
	//创建结点
	LinkList node1 = (LinkList)malloc(sizeof(ListNode));
    node1->data=arr[0];
		LinkList node2 = (LinkList)malloc(sizeof(ListNode));
    node2->data=arr[1];
    	LinkList node3 = (LinkList)malloc(sizeof(ListNode));
    node3->data=arr[2];
    	LinkList node4 = (LinkList)malloc(sizeof(ListNode));
    node4->data=arr[3];
    	LinkList node5 = (LinkList)malloc(sizeof(ListNode));
    node5->data=arr[4];
    	LinkList node6 = (LinkList)malloc(sizeof(ListNode));
    node6->data=arr[5];
    	LinkList node7 = (LinkList)malloc(sizeof(ListNode));
    node7->data=arr[6];
    	LinkList node8 = (LinkList)malloc(sizeof(ListNode));
    node8->data=arr[7];
    	LinkList node9 = (LinkList)malloc(sizeof(ListNode));
    node9->data=arr[8];
    	LinkList node10 = (LinkList)malloc(sizeof(ListNode));
    node10->data=arr[9];
 
 	//链接10个结点 
    node1->next = node2;
    node2->next = node3;
    node3->next = node4;
    node4->next = node5; 
    node5->next = node6;
    node6->next = node7;
    node7->next = node8;
    node8->next = node9;
	node9->next = node10;
    node10->next = NULL;
	
	LinkList head = node1; //让头指针指向第二个结点 
	return head;
    //在此插入必要语句
}


//单链表的打印:
void PrintList(LinkList head)
{
	LinkList pcur = head; //让head指针依旧指向原结点 
    while (pcur)  //pcur != NULL
    {
        printf("%d->", pcur->data);
        pcur = pcur->next;
    }
    printf("NULL\n");
    //在此插入必要语句
}

//单链表的查找:
void LocateNode(LinkList head,DataType key)
{
	LinkList pcur = head;
	int count=0,flag=0;
	while(pcur)
	{
		count++;
		if(pcur->data==key)
		{
			flag=1;
			printf("找到了!在第%d个结点",count);
		}
		pcur=pcur->next;
	}
	if(flag==0)
	{
		printf("没找到"); 
	}
    //在此插入必要语句
}

//单链表的插入:
void InsertList(LinkList head,DataType x,int i)
{	
		int j=0;
	LinkList current = head;//从头遍历 
	while(current->next!=NULL)
	{
		j++;//计数,若j=i-1,循环退出
		if (j==i-1)
		{
			break;
		} 
		current = current->next;
	}
	LinkList p = (LinkList) malloc (sizeof (ListNode));//建立新结点
	p->data = x;
	p->next = current->next;
	current->next = p;
	//在此插入必要的语句
}

//单链表的删除:
void DeleteList(LinkList head,int i)
{
		int j=0;
	LinkList current = head;//从头遍历 
	while(current->next!=NULL)
	{
		j++;//计数,若j=i-1,循环退出
		if (j==i-1)
		{
			break;
		} 
		current = current->next;
	}
	current->next = current->next->next;
	//在此插入必要的语句
}


//修改为循环单链表:
void ChangeCircList(LinkList head)
{
	LinkList current = head;
	int j=0; 
	while(current->next!=NULL)//当current下一个非空 
	{
		current = current->next;
		if (current->next==NULL)//如果current下一个为空,说明current到尾部 
		{
			current->next = head;
			break;
		}
	}
	//在此插入必要的语句
}


//循环单链表的打印:
void PrintCircList(LinkList head)
{
	int j,n;
	n=10;
	LinkList current = head;
	for(j=0;j<n;j++)
	{
		printf("%d ",current->data);
		current=current->next;
	}
	//在此插入必要的语句
}
相关推荐
小郝 小郝37 分钟前
【C语言】strstr查找字符串函数
c语言·开发语言
Dovis(誓平步青云)2 小时前
【数据结构】排序算法(中篇)·处理大数据的精妙
c语言·数据结构·算法·排序算法·学习方法
nuo5342022 小时前
黑马 C++ 学习笔记
c语言·c++·笔记·学习
电星托马斯14 小时前
C++中顺序容器vector、list和deque的使用方法
linux·c语言·c++·windows·笔记·学习·程序人生
march_birds19 小时前
FreeRTOS 与 RT-Thread 事件组对比分析
c语言·单片机·算法·系统架构
小麦嵌入式20 小时前
Linux驱动开发实战(十一):GPIO子系统深度解析与RGB LED驱动实践
linux·c语言·驱动开发·stm32·嵌入式硬件·物联网·ubuntu
jelasin21 小时前
LibCoroutine开发手记:细粒度C语言协程库
c语言
篝火悟者21 小时前
自学-C语言-基础-数组、函数、指针、结构体和共同体、文件
c语言·开发语言
神里流~霜灭1 天前
蓝桥备赛指南(12)· 省赛(构造or枚举)
c语言·数据结构·c++·算法·枚举·蓝桥·构造
双叶8361 天前
(C语言)单链表(1.0)(单链表教程)(数据结构,指针)
c语言·开发语言·数据结构·算法·游戏