#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include <stdbool.h> /*bool类型需要的头文件*/
typedef struct Node
{
int data;/*数据域*/
struct Node *pNext;/*指针域*/
} NODE, *PNODE;/*NODE= struct Node ,PNODE= struct Node* */
PNODE create_list(void);
void traverse_list(PNODE pHead);
bool is_empty(PNODE pHead);
int length_list(PNODE);
bool insert_list(PNODE,int,int);
bool delete_list(PNODE,int,int*);
void sort_list(PNODE); /*排序*/
int main (void)
{
int val;
PNODE pHead = NULL;/*等价于struct Node*pHead=NULL:*/
pHead = create_list();/*create_list()功能:创建一个非循环单链表,并把该链表的头结点的地址赋给 pHead */
printf("\n");
traverse_list(pHead);
if(is_empty(pHead))
printf("链表为空,");
else
printf("链表不为空,");
int len= length_list(pHead);
printf("链表长度为%d\n",len);
sort_list( pHead);
printf("排序后链表为\n");
traverse_list(pHead);
insert_list(pHead,3,47);
printf("插入元素后链表为\n");
traverse_list(pHead);
if( delete_list(pHead,3,&val))
{
printf("删除成功,删除的元素为%d\n",val);
}
else
{
printf("删除失败");
}
traverse_list(pHead);
return 0;
}
PNODE create_list(void)
{
int len;/*用来存放有效结点的个数*/
int i;
int val;/*用来临时存放用户输入的结点的值*/
PNODE pHead = (PNODE )malloc(sizeof(NODE) );/*分配了一个不存放有效数据的头结点*/
if(NULL ==pHead )
{
printf("程序分配失败,程序终止!");
exit(-1);
}
PNODE pTail = pHead;
pTail->pNext = NULL;/* len=0的特殊情况 */
printf("请输入您需要生成的结点的长度 \n");
printf("len = ");
scanf ("%d",&len);
for(i=0;i<len; i++)
{
printf("请输入第%d个结点的值 \n",i+1);
scanf("%d",&val);
PNODE pNew=(PNODE)malloc(sizeof(NODE));
if(NULL == pNew )
{
printf("程序分配失败,程序终止!");
exit(-1);
}
pNew->data=val;
pTail->pNext=pNew; /* 假设一个变量pTail永远指向尾结点 */
pNew->pNext=NULL;
pTail = pNew; /* pNew->data=val; pHead->pNext=pNew; pNew->pNext=NULL; 存在覆盖问题 */
}
return pHead;
}
void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;
while (NULL != p)
{
printf("%d",p->data);
p = p->pNext;
printf("\n");
}
}
bool is_empty(PNODE pHead)
{
if(NULL == pHead->pNext)
return true;
else
return false;
}
int length_list(PNODE pHead)
{
PNODE p=pHead->pNext;
int len = 0;
while(NULL!=p)
{
++len;
p=p->pNext;
}
return len;
}
void sort_list(PNODE pHead) /*排序*/
{
int i,j ,t;
int len =length_list( pHead);
PNODE p,q;
for(i=0,p=pHead->pNext;i<len-1;++i,p=p->pNext)
{
for(j=i+1,q=p->pNext;j<len;++j,q=q->pNext)
{
if(p->data>q->data)
{
t=p->data;
p->data=q->data;
q->data=t;
}
}
}
return;
}
bool insert_list(PNODE pHead,int pos,int val) /*在pHead所指向的链表中的第pos个结点前插入一个新的结点,值为val*/
{ /*pos的值从1开始*/
int i=0;
PNODE p = pHead;
while (NULL !=p&& i<pos-1)
{
p=p->pNext;
++i;
}
if(i>pos-1||NULL ==p)
return false;
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(NULL == pNew)
{
printf("动态内存分配失败\n");
exit(-1);
}
pNew->data=val;
PNODE q=p->pNext;
p->pNext=pNew;
pNew->pNext=q;
}
bool delete_list(PNODE pHead,int pos,int*pval)
{
int i=0;
PNODE p = pHead;
while (NULL !=p->pNext&& i<pos-1)
{
p=p->pNext;
++i;
}
if(i>pos-1||NULL ==p->pNext)
return false;
PNODE q=p->pNext;
*pval = q->data; /*存储被删除数据*/
p->pNext=p->pNext->pNext;/*删除p结点后面的结点*/
free(q);
q = NULL;
}
#include<malloc.h>
#include<stdlib.h>
#include <stdbool.h> /*bool类型需要的头文件*/
typedef struct Node
{
int data;/*数据域*/
struct Node *pNext;/*指针域*/
} NODE, *PNODE;/*NODE= struct Node ,PNODE= struct Node* */
PNODE create_list(void);
void traverse_list(PNODE pHead);
bool is_empty(PNODE pHead);
int length_list(PNODE);
bool insert_list(PNODE,int,int);
bool delete_list(PNODE,int,int*);
void sort_list(PNODE); /*排序*/
int main (void)
{
int val;
PNODE pHead = NULL;/*等价于struct Node*pHead=NULL:*/
pHead = create_list();/*create_list()功能:创建一个非循环单链表,并把该链表的头结点的地址赋给 pHead */
printf("\n");
traverse_list(pHead);
if(is_empty(pHead))
printf("链表为空,");
else
printf("链表不为空,");
int len= length_list(pHead);
printf("链表长度为%d\n",len);
sort_list( pHead);
printf("排序后链表为\n");
traverse_list(pHead);
insert_list(pHead,3,47);
printf("插入元素后链表为\n");
traverse_list(pHead);
if( delete_list(pHead,3,&val))
{
printf("删除成功,删除的元素为%d\n",val);
}
else
{
printf("删除失败");
}
traverse_list(pHead);
return 0;
}
PNODE create_list(void)
{
int len;/*用来存放有效结点的个数*/
int i;
int val;/*用来临时存放用户输入的结点的值*/
PNODE pHead = (PNODE )malloc(sizeof(NODE) );/*分配了一个不存放有效数据的头结点*/
if(NULL ==pHead )
{
printf("程序分配失败,程序终止!");
exit(-1);
}
PNODE pTail = pHead;
pTail->pNext = NULL;/* len=0的特殊情况 */
printf("请输入您需要生成的结点的长度 \n");
printf("len = ");
scanf ("%d",&len);
for(i=0;i<len; i++)
{
printf("请输入第%d个结点的值 \n",i+1);
scanf("%d",&val);
PNODE pNew=(PNODE)malloc(sizeof(NODE));
if(NULL == pNew )
{
printf("程序分配失败,程序终止!");
exit(-1);
}
pNew->data=val;
pTail->pNext=pNew; /* 假设一个变量pTail永远指向尾结点 */
pNew->pNext=NULL;
pTail = pNew; /* pNew->data=val; pHead->pNext=pNew; pNew->pNext=NULL; 存在覆盖问题 */
}
return pHead;
}
void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;
while (NULL != p)
{
printf("%d",p->data);
p = p->pNext;
printf("\n");
}
}
bool is_empty(PNODE pHead)
{
if(NULL == pHead->pNext)
return true;
else
return false;
}
int length_list(PNODE pHead)
{
PNODE p=pHead->pNext;
int len = 0;
while(NULL!=p)
{
++len;
p=p->pNext;
}
return len;
}
void sort_list(PNODE pHead) /*排序*/
{
int i,j ,t;
int len =length_list( pHead);
PNODE p,q;
for(i=0,p=pHead->pNext;i<len-1;++i,p=p->pNext)
{
for(j=i+1,q=p->pNext;j<len;++j,q=q->pNext)
{
if(p->data>q->data)
{
t=p->data;
p->data=q->data;
q->data=t;
}
}
}
return;
}
bool insert_list(PNODE pHead,int pos,int val) /*在pHead所指向的链表中的第pos个结点前插入一个新的结点,值为val*/
{ /*pos的值从1开始*/
int i=0;
PNODE p = pHead;
while (NULL !=p&& i<pos-1)
{
p=p->pNext;
++i;
}
if(i>pos-1||NULL ==p)
return false;
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(NULL == pNew)
{
printf("动态内存分配失败\n");
exit(-1);
}
pNew->data=val;
PNODE q=p->pNext;
p->pNext=pNew;
pNew->pNext=q;
}
bool delete_list(PNODE pHead,int pos,int*pval)
{
int i=0;
PNODE p = pHead;
while (NULL !=p->pNext&& i<pos-1)
{
p=p->pNext;
++i;
}
if(i>pos-1||NULL ==p->pNext)
return false;
PNODE q=p->pNext;
*pval = q->data; /*存储被删除数据*/
p->pNext=p->pNext->pNext;/*删除p结点后面的结点*/
free(q);
q = NULL;
}