二工大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;
	}
	//在此插入必要的语句
}
相关推荐
尼尔森系4 小时前
排序与算法:希尔排序
c语言·算法·排序算法
GEEK.攻城狮5 小时前
使用VSCODE开发C语言程序
c语言·ide·vscode
Victoria.a5 小时前
数组和指针常见笔试题(深度剖析)
c语言·开发语言
xiaohai@Linux7 小时前
ESP32 在IDF_V5.3.1版本下实现AP无线热点模式!(带WIFI事件处理)
c语言·嵌入式硬件·tcp/ip·wifi·esp32
L_09077 小时前
【C】初阶数据结构6 -- 队列
c语言·开发语言·数据结构
charlie1145141918 小时前
(萌新入门)如何从起步阶段开始学习STM32 —— 0.碎碎念
c语言·stm32·单片机·嵌入式硬件·学习·教程
极客代码8 小时前
C语言中的链表封装
c语言·开发语言·数据结构·链表
L_09079 小时前
【C】栈的应用
c语言·数据结构·算法
不灭锦鲤9 小时前
c语言(函数)
c语言·c++·算法
W说编程12 小时前
嵌入式Linux系统UART驱动移植专题详解(3000+字图文实战指南)
linux·c语言·驱动开发·嵌入式硬件