#include <stdio.h>
#include <stdlib.h>
#define ElemType int
typedef struct LinkNode{
ElemType data;
struct LinkNode *next;
}LinkNode;
void List_TailInsert(LinkNode *L){//尾插法建立单链表
int x;
LinkNode *s,*r=L;
printf("请输入你要创建的数据:");
scanf("%d",&x);
while(x!=9999){
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
}
/*void List_HeadInsert(LinkNode *L){//头插法建立单链表
LinkNode *s;
int x;
//L=(LinkNode*)malloc(sizeof(LinkNode));
L->next=NULL;
printf("请输入你要创建的数据:");
scanf("%d",&x);
while(x!=9999){
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
}*/
int GetElem(LinkNode L,int i){//按序号查找结点值
int j=1;
LinkNode *p=L.next;
if(i==0)
return p->data;
if(i<1)
printf("您输入的数据有误");
while(p && j<i){
p=p->next;
j++;
}
return p->data;
}
int LocateElem(LinkNode L,ElemType e){//按值查找结点
LinkNode *p=L.next;
int i=1;
while(p && p->data!=e){
p=p->next;
i++;
}
return i;
}
void InsertList(LinkNode *L,int i){ //插入结点,在第i个位置插入结点时间复杂度为o(n),在指定结点后面插入结点时间复杂度为0(1)
LinkNode *s,*p;
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=i;
p=L->next;//这边是在第一个结点后面插入
s->next=p->next;
p->next=s;
/*temp=p->data;
p->data=s->data;
s->data=temp;
一般习惯用后插操作,如果插入该元素前面,交换位置即可!
*/
}
void DeleteList(LinkNode *L){//删除结点 ,时间复杂度同插入的机制一样
LinkNode *p,*q;
p=L->next->next->next;//这边删除第三个结点的值
q=p->next;
p->data=p->next->data;
p->next=q->next;
free(q);
}
void PrintList(LinkNode *L){
LinkNode *temp=L->next;
if(L->next){
printf("您创建的单链表为:");
while(temp){
printf("%5d",temp->data);
if(temp->next){
printf("->");
}
temp=temp->next;
}
}
}
void PrintList_Insert(LinkNode *L){
LinkNode *temp=L->next;
if(L->next){
printf("您插入结点后的单链表为:");
while(temp){
printf("%5d",temp->data);
if(temp->next){
printf("->");
}
temp=temp->next;
}
}
}
void PrintList_Delete(LinkNode *L){
LinkNode *temp=L->next;
if(L->next){
printf("您删除结点后的单链表为:");
while(temp){
printf("%5d",temp->data);
if(temp->next){
printf("->");
}
temp=temp->next;
}
}
}
int main()
{
LinkNode L;
//List_HeadInsert(&L);
List_TailInsert(&L);
PrintList(&L);
printf("\n");
printf("您查找的第i个结点数据是%d\n",GetElem(L,5));
printf("您查找的数据是第%d个结点\n",LocateElem(L,88));
InsertList(&L,8);
PrintList_Insert(&L);
printf("\n");
DeleteList(&L);
PrintList_Delete(&L);
}
C语言单链表的操作
于 2022-04-03 11:42:37 首次发布