二工大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;
	}
	//在此插入必要的语句
}
相关推荐
Zfox_30 分钟前
【Linux】进程信号全攻略(二)
linux·运维·c语言·c++
少年负剑去1 小时前
第十五届蓝桥杯C/C++B组题解——数字接龙
c语言·c++·蓝桥杯
skaiuijing2 小时前
Sparrow系列拓展篇:对调度层进行抽象并引入IPC机制信号量
c语言·算法·操作系统·调度算法·操作系统内核
xinghuitunan4 小时前
打印等边三角形和直角三角形(用循环)C语言
c语言
闲晨9 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
DARLING Zero two♡13 小时前
关于我、重生到500年前凭借C语言改变世界科技vlog.16——万字详解指针概念及技巧
c语言·开发语言·科技
QAQ小菜鸟14 小时前
一、初识C语言(1)
c语言
何曾参静谧15 小时前
「C/C++」C/C++ 之 变量作用域详解
c语言·开发语言·c++
互联网打工人no115 小时前
每日一题——第一百二十一题
c语言
朱一头zcy16 小时前
C语言复习第9章 字符串/字符/内存函数
c语言