#include<stdio.h>
#include<malloc.h>
typedef int DataType;
typedef struct Linknode{
DataType data;
struct Linknode* next;
}Linklist;
void * Initlist() {
Linklist * head;//头结点
head = (Linklist*)malloc(sizeof(Linklist));//申请一个结点空间
head->next = NULL;//链表为空
return head;
}
void Creatlist_H(Linklist* head, int n) {
Linklist * s;
int i;
printf("请输入%d个整数:", n);
for (i = 0; i < n; i++) {
s= (Linklist*)malloc(sizeof(Linklist));//生成一个新结点
scanf("%d",&s->data);//依次给新结点的数据域赋值
s->next= head->next;//将新结点的指针域存放头结点的指针域
head->next=s;//将新结点插入头结点的后面
}
printf("建立链表操作成功!");
}
void Displist(Linklist* head) {
Linklist* p;
p = head->next;//*p指针指向链表第一个结点
while(p != NULL) {//当指针不为空的时候,为空说明指向了尾结点(最后一个数)
printf("%5d", p->data);//依次读取链表里的值,存入数据域中
p=p->next;//读完一个接着读下一个
}
}
void InsElem(Linklist* head, int n, DataType x) {
Linklist* s;
int i=0;
while(head->next!= NULL && i < n - 1) { //定位插入结点的位置(移动head指针一直到找到下标为n-1的位置)
head = head->next;//移动head指针
i++;//每移动指针一次下标加一
}
if (head != NULL) { //找到n-1位置的情况下,指针head不为空
s = (Linklist*)malloc(sizeof(Linklist));//申请要插入的结点的内存空间
s->data = x; //新结点的数据域为要插入的值
s->next = head->next;//将新结点s的指针域与后面的结点相连
head->next = s;//将head与新结点相连
printf("插入成功!\n");
}
else
printf("插入失败!\n");
}
int Length(Linklist* heat) {
int i = 0;
while(heat->next != NULL) {
heat = heat->next;//结点依次往下
i++;
}
return i;
}
void Locate(Linklist* head, DataType x) {
Linklist* s;
s = head->next;//首节点
int j=1;
while(s->data!=x&&s!=NULL){ //查找定位
s = s->next;
j++;
}
if (s!=NULL)
printf("查找成功!位置在%d,值为%d\n", j,s->data);
else
printf("查找失败\n");
}
void GetElem(Linklist* head, int n) {
Linklist* s;
s = head->next;
int j = 1;
while (s!= NULL && j < n) {
s = s->next;
j++;
}
if (j == n)
printf("查找成功!元素的位置为%d,值为%d", j, s->data);
}
void DelElem(Linklist* head,int n) {
Linklist* s,*p;
p=head;
int j = 0;
DataType x;
while (p->next != NULL && j < n - 1) {
p = p->next;
j++;
}
if (p->next != NULL && j == n - 1) {
s=p->next;
x = s->data;
p->next = s->next;
free(s);
printf("删除第%d位上的元素%d成功!", n, x);
}
}
int main() {
Linklist* head;
DataType x;
int n;
//初始化Initlist()
head = Initlist();
printf("请输入要建立线性表的长度:");
scanf("%d", &n);
//建立单链表(尾插法)Creatlist_L(Linklist *head,int n)
//(头插法)Creatlist_H(Linklist *head,int n)
Creatlist_H(head, n);
Displist(head); //显示链表Displist(Linklist *head)
//插入结点InsElem(Linklist *head,int n,DataType x)
printf("\n请输入要插入的位置:");
scanf("%d", &n);
printf("请输入要插入的值:");
scanf("%d", &x);
InsElem(head, n, x);
//显示插入后的表
Displist(head);
Length(head); //算链表的长Length(Linklist *heat)
//查找(按值)Locate(Linklist *head,DataType x)
printf("\n请输入要查找的值:");
scanf("%d", &x);
Locate(head, x);
//查找(按序号)GetElem(Linklist *head,int n,DataType x)
printf("\n请输入要查找数的位置:");
scanf("%d", &n);
GetElem(head, n);
//删除链表里的元素DelElem(Linklist *head,int n,DataType x)
printf("\n请输入要删除元素的位置:");
scanf("%d", &n);
DelElem(head, n);
Displist(head);//删除后的链表
}