具体题目如下:
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)
{
//在此插入必要的语句
}
需要完成的代码如下:
- 从键盘输入10个整数,产生带表头的单链表,并输入结点值。
- 从键盘输入1个整数,在单链表中查找该结点。若找到,则显示"找到了";否则,则显示"找不到"。
- 从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出单链表所有结点值,观察输出结果。
- 从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。
- 把单链表变成带表头结点的循环链表,输出循环单链表所有结点值,观察输出结果。
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;
}
//在此插入必要的语句
}