`
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int ElementType; // 定义数据类型,可根据需要进行其他类型定义
// 链表节点的定义
typedef struct ListNode {
ElementType Element; // 数据域,存放数据
ListNode* Next; // 指向下一个链表节点
}Node, *PNode;
// 链表创建函数定义
PNode CreateList(void) {
int len ; // 用于定义链表长度
int val ; // 用于存放节点数值
PNode PHead = (PNode)malloc(sizeof(Node)); // 创建分配一个头节点内存空间
//头节点相当于链表的哨兵,不存放数据,指向首节点(第一个节点)
if (PHead == NULL) // 判断是否分配成功
{
printf(“空间分配失败 \n”);
exit(-1);
}
PNode PTail = PHead; // 链表的末尾节点,初始指向头节点
PTail->Next = NULL; // 最后一个节点指针置为空
printf(“请输入节点个数:”);
scanf("%d", &len); // 输入节点个数
for (int i = 0; i < len; i++) {
PNode pNew = (PNode)malloc(sizeof(Node)); // 分配一个新节点
if (pNew == NULL) {
printf(“分配新节点失败\n”);
exit(-1);
}
printf(“请输入第 %d 个节点的数据:”, i + 1);
scanf("%d", &val); // 输入链表节点的数据
pNew->Element = val; // 把数据赋值给节点数据域
PTail->Next = pNew; // 末尾节点指针指向下一个新节点
pNew->Next = NULL; // 新节点指针指向为空
PTail = pNew; // 将新节点复制给末尾节点
}
printf(“创建链表成功\n”);
return PHead; // 返回头节点
//输出带头节点的单链表
}
void PrintLList(Node * q){
Node *p;
p=q->Next;
printf(“字符单链表结果是:\n(”);
while(p!=NULL){
printf("%d,",p->Element);
p=p->Next;
}
printf("\b)\n");
}
//取结点
Node *GetLListElem(Node * L,int i){
int j;
Node *p;
p=L;
j=0;
while((p->Next!=NULL)&&(j<i))
{
p=p->Next;
j++;
}
if(i==j)
return p;
else
return NULL;
}
// 主函数
int main(){
//PNode List = CreateList(); //创建一个指针,使其指向新创建的链表的头指针
// PrintLList(List);
int a;
PNode List;
do{
printf(“1----创建单链表\n”);
printf(“2----取结点\n”);
printf(“3----输出单链表\n”);
scanf("%d",&a);
switch(a){
case 1:
List = CreateList(); //创建一个指针,使其指向新创建的链表的头指针
break;
case 2:
printf(“选择位置:”);
int i;
scanf("%d",&i);
GetLListElem(List,i);
break;
case 3:
PrintLList(List);
break;
case 4:
a=0;
break;
}
return 0;
}while(a!=0);
return 0;
}
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int ElementType; // 定义数据类型,可根据需要进行其他类型定义
// 链表节点的定义
typedef struct ListNode {
ElementType Element; // 数据域,存放数据
ListNode* Next; // 指向下一个链表节点
}Node, *PNode;
// 链表创建函数定义
PNode CreateList(void) {
int len ; // 用于定义链表长度
int val ; // 用于存放节点数值
PNode PHead = (PNode)malloc(sizeof(Node)); // 创建分配一个头节点内存空间
//头节点相当于链表的哨兵,不存放数据,指向首节点(第一个节点)
if (PHead == NULL) // 判断是否分配成功
{
printf("空间分配失败 \n");
exit(-1);
}
PNode PTail = PHead; // 链表的末尾节点,初始指向头节点
PTail->Next = NULL; // 最后一个节点指针置为空
printf("请输入节点个数:");
scanf("%d", &len); // 输入节点个数
for (int i = 0; i < len; i++) {
PNode pNew = (PNode)malloc(sizeof(Node)); // 分配一个新节点
if (pNew == NULL) {
printf("分配新节点失败\n");
exit(-1);
}
printf("请输入第 %d 个节点的数据:", i + 1);
scanf("%d", &val); // 输入链表节点的数据
pNew->Element = val; // 把数据赋值给节点数据域
PTail->Next = pNew; // 末尾节点指针指向下一个新节点
pNew->Next = NULL; // 新节点指针指向为空
PTail = pNew; // 将新节点复制给末尾节点
}
printf("创建链表成功\n");
return PHead; // 返回头节点
//输出带头节点的单链表
}
void PrintLList(Node * q){
Node *p;
p=q->Next;
printf("字符单链表结果是:\n");
while(p!=NULL){
printf("%d,",p->Element);
p=p->Next;
}
printf("\b)\n");
}
//取结点
Node *GetLListElem(Node * L,int i){
int j;
Node *p;
p=L;
j=0;
while((p->Next!=NULL)&&(j<i))
{
p=p->Next;
j++;
}
if(i==j)
return p;
else
printf("找不到结点");
return NULL;
}
//求表的长度
int GetLListLength(Node *L){
Node *p;
int j;
p=L->Next;
j=0;
while(p!=NULL){
p=p->Next;
j++;
}
return j;
}
//插入运算
int insertLList(Node *L,int i,ElementType x){
Node *pre,*s;
int k;
pre=L;
k=0;
while(pre->Next){
pre=pre->Next;
k=k+1;
}
if(!pre)
{
printf("插入位置不合理!");
return 0;
}
s=(Node*)malloc(sizeof(Node));
s->Element=x;
s->Next=pre->Next;
pre->Next=s;
return 1;
}
//删除运算
int DeleteLList(Node *L,int i, ElementType *e){
Node *pre,*r;
int k;
pre=L;
k=0;
while(pre->Next!=NULL&&k<i-1){
pre=pre->Next;
k=k+1;
}
if(!(pre->Next)){
printf("删除节点的位置不合理!");
return -1;
}
r=pre->Next;
pre->Next=pre->Next->Next;
*e=r->Element;
free(r);
printf("成功删除结点!");
return 1;
}
// 主函数
int main(){
PNode List = CreateList(); //创建一个指针,使其指向新创建的链表的头指针
int x,a,b;
PrintLList(List);
printf("选取一个结点并输出!输入结点数:");
scanf("%d",&x);
printf("该结点的值为:%d", *GetLListElem(List ,x));
printf("表的长度%d", GetLListLength(List));
printf("\n");
printf("\n");
printf("现在开始插入运算\n");
printf("请输入插入的位置:");
scanf("%d",&a);
printf("请输入插入的元素");
scanf("%d",&b);
insertLList(List,a,b);
printf("更新后的链表:\n");
PrintLList(List);
printf("现在开始进行删除操作!");
printf("\n");
printf("请输入删除的结点:");
int xx;
ElementType *e;
scanf("%d",&xx);
DeleteLList(List,xx,e);
printf("%d",*e);
printf("更新后的链表:\n");
PrintLList(List);
/*int a;
PNode List;
do{
printf("1----创建单链表\n");
printf("2----取结点\n");
printf("3----输出单链表\n");
scanf("%d",&a);
switch(a){
case 1:
List = CreateList(); //创建一个指针,使其指向新创建的链表的头指针
break;
case 2:
printf("选择位置:");
int i;
scanf("%d",&i);
GetLListElem(List,i);
break;
case 3:
PrintLList(List);
break;
case 4:
a=0;
break;
}
return 0;
}while(a!=0);
return 0;*/
}