数据结构第二次作业:单链表。
#include <stdio.h>
#include <stdlib.h>
//结构体的定义
typedef int elemtype;
typedef struct node
{
elemtype data;
struct node * next;
} LinkList;
LinkList *head;
//用头插法创建单链表
LinkList *Create_LinkListF()
{
elemtype ix;
LinkList *head, *p;
head = (LinkList *) malloc(sizeof(LinkList));
if(head == NULL)
{
return head;
}
head -> next = NULL;
printf("请输入数据直到输入0结束:\n");
scanf("%d",&ix);
while(ix != 0)
{
p = (LinkList *)malloc(sizeof(LinkList));
if(p == NULL)
{
return head;
}
p -> data = ix;
p -> next = head -> next;
head -> next = p;
scanf("%d",&ix);
}
return head;
}
//查找某序号的结点
LinkList *GetData_LinkList(LinkList *head, int i)
{
LinkList *p;
int j = 0;
if(i <= 0)
{
return NULL;
}
p = head;
while(p -> next != NULL && j < i)
{
p = p -> next;
j++;
}
if(i == j)
{
return p;
}
else return NULL;
}
//后插
void InsertAfter_LinkList(LinkList *p, LinkList *s)
{
s -> next = p -> next;
p -> next = s;
}
//删除结点的后继节点
int DeleteAfter_LinkList(LinkList *p)
{
LinkList *r;
if(! p)
{
return 0;
}
r = p -> next;
if(! r)
{
return 0;
}
p -> next = r -> next;
free(r);
return 1;
}
//遍历
int Print_LinkList(LinkList *head)
{
LinkList *p = head -> next;
if(p == NULL)
{
return 0;
}
while(p != NULL)
{
printf("%d\t", p -> data);
p = p -> next;
}
printf("\n");
return 1;
}
int main()
{
int *List_head;
int *Insert_head;
int newData;
int deleteNode;
int find;
int chose = -1;
List_head = Create_LinkListF();
LinkList *Insert_List;
Insert_List = (LinkList *)malloc(sizeof(LinkList));
printf("以下是链表中的元素\n");
Print_LinkList(List_head);
printf("1.查找某序号的结点\n");
printf("2.后插\n");
printf("3.删除结点的后继结点\n");
printf("4.遍历\n");
printf("0.退出程序\n");
while(chose != 0)
{
printf("输入功能前的数字来选择你想进行的操作\n");
scanf("%d",&chose);
switch(chose)
{
case 1:
printf("输入你想查找的序号\n");
scanf("%d",&find);
printf("%d\n",GetData_LinkList(List_head, find) -> data);
break;
case 2:
printf("输入你想插入的结点\n");
scanf("%d",&newData);
Insert_List -> data = newData;
InsertAfter_LinkList(List_head, Insert_List);
printf("以下是链表中的元素\n");
Print_LinkList(List_head);
break;
case 3:
printf("输入你想删除的结点的后继结点\n");
scanf("%d",&deleteNode);
DeleteAfter_LinkList(GetData_LinkList(List_head, deleteNode));
printf("以下是链表中的元素\n");
Print_LinkList(List_head);
break;
case 4:
printf("以下是链表中的元素\n");
Print_LinkList(List_head);
break;
case 0:
printf("程序退出");
return 0;
default:
printf("你输入的功能序号不合法\n");
break;
}
}
return 0;
}