重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1 思路: 主要是链表的插入和删除操作
创新互联是专业的鹤岗网站建设公司,鹤岗接单;提供网站制作、成都网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行鹤岗网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
2 代码
#includestdio.h
#includestdlib.h
typedef struct node
{
int data;
struct node *next;
}node_type;
void push(node_type* stack, int elem){
node_type*node = (node_type*)malloc(sizeof(node_type));
node-data = elem;
node-next = stack;
stack = node;
}
int pop(node_type* stack){
int elem = stack-data;
node_type*node = stack;
stack = stack-next;
free(node);
return elem;
}
bool IsEmpty(node_type* stack){
return stack == NULL;
}
void display(node_type*stack){
while (stack){
printf("%d ", stack-data);
stack = stack-next;
}
puts("");
}
void destroy(node_type*stack){
while (!IsEmpty(stack)){
pop(stack);
}
}
int main(){
puts("(1) 建立空链栈");
node_type*stack = NULL;
puts("\n(2) 调用进栈函数,将从键盘输入的数据元素逐个进栈,输入0结束;");
int num;
scanf("%d", num);
while (num != 0){
push(stack, num);
scanf("%d", num);
}
puts("\n(3) 显示进栈后的数据元素");
display(stack);
puts("\n(4) 调用两次出栈函数,显示出栈后的数据元素");
if (!IsEmpty(stack))
printf("%d\n", pop(stack));
if (!IsEmpty(stack))
printf("%d\n", pop(stack));
destroy(stack);
getchar();
getchar();
return 0;
}
3 运行效果
if中可以赋值给head的理由很简单。
因为 if(PTScount(head) == 0)
if判断的就是看它是不是 第一个元素。
如果是第一个元素,自然直接将ins赋值给head。
head所代表的就是第一个元素。
如果到了else这里,那么很明显就不是第一个元素了。
那这个时候肯定就不可以直接复制给head了呀,因为head可是代表第一个元素呀。
所以,你这是肯定改不了的。
楼主你好
代码具体如下:
#includestdio.h
#includestdlib.h
typedef struct node
{
char ch;
struct node *next;
}LinkList;
void CreatList(LinkList * h)
{
LinkList *p;
LinkList *r=h;//尾结点 开始指向头结点
int i=0;
for(;i26;i++)
{
p=(LinkList *)malloc(sizeof(LinkList));
p-ch='a'+i;
r-next=p;
r=p;
}
r-next=NULL;
}
void ListTransfer(LinkList *h)
{
LinkList *p=h-next;
while(p)
{
(p-ch)-='a'-'A';
p=p-next;
}
}
void ListPrint(LinkList *h)
{
LinkList *p=h-next;
while(p)
{
putchar(p-ch);
p=p-next;
}
printf("\n");
}
int main()
{
LinkList *head;
head=(LinkList *)malloc(sizeof(LinkList));
CreatList(head);
printf("转换前:\n");
ListPrint(head);
ListTransfer(head);
printf("转换后:\n");
ListPrint(head);
return 0;
}
希望能帮助你哈
比你要求的要多很多
看注释
#include "stdio.h"
#include stdlib.h
#include "string.h"
typedef int elemType ;
/************************************************************************/
/* 以下是关于线性表链接存储(单链表)操作的18种算法 */
/* 1.初始化线性表,即置单链表的表头指针为空 */
/* 2.创建线性表,此函数输入负数终止读取数据*/
/* 3.打印链表,链表的遍历*/
/* 4.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表 */
/* 5.返回单链表的长度 */
/* 6.检查单链表是否为空,若为空则返回1,否则返回0 */
/* 7.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行 */
/* 8.从单链表中查找具有给定值x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL */
/* 9.把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0 */
/* 10.向单链表的表头插入一个元素 */
/* 11.向单链表的末尾添加一个元素 */
/* 12.向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0 */
/* 13.向有序单链表中插入元素x结点,使得插入后仍然有序 */
/* 14.从单链表中删除表头结点,并把该结点的值返回,若删除失败则停止程序运行 */
/* 15.从单链表中删除表尾结点并返回它的值,若删除失败则停止程序运行 */
/* 16.从单链表中删除第pos个结点并返回它的值,若删除失败则停止程序运行 */
/* 17.从单链表中删除值为x的第一个结点,若删除成功则返回1,否则返回0 */
/* 18.交换2个元素的位置 */
/* 19.将线性表进行快速排序 */
/************************************************************************/
typedef struct Node{ /* 定义单链表结点类型 */
elemType element;
struct Node *next;
}Node;
/* 1.初始化线性表,即置单链表的表头指针为空 */
void initList(Node **pNode)
{
*pNode = NULL;
printf("initList函数执行,初始化成功\n");
}
/* 2.创建线性表,此函数输入负数终止读取数据*/
Node *creatList(Node *pHead)
{
Node *p1;
Node *p2;
p1=p2=(Node *)malloc(sizeof(Node)); //申请新节点
if(p1 == NULL || p2 ==NULL)
{
printf("内存分配失败\n");
exit(0);
}
memset(p1,0,sizeof(Node));
scanf("%d",p1-element); //输入新节点
p1-next = NULL; //新节点的指针置为空
while(p1-element 0) //输入的值大于0则继续,直到输入的值为负
{
if(pHead == NULL) //空表,接入表头
{
pHead = p1;
}
else
{
p2-next = p1; //非空表,接入表尾
}
p2 = p1;
p1=(Node *)malloc(sizeof(Node)); //再重申请一个节点
if(p1 == NULL || p2 ==NULL)
{
printf("内存分配失败\n");
exit(0);
}
memset(p1,0,sizeof(Node));
scanf("%d",p1-element);
p1-next = NULL;
}
printf("creatList函数执行,链表创建成功\n");
return pHead; //返回链表的头指针
}
/* 3.打印链表,链表的遍历*/
void printList(Node *pHead)
{
if(NULL == pHead) //链表为空
{
printf("PrintList函数执行,链表为空\n");
}
else
{
while(NULL != pHead)
{
printf("%d ",pHead-element);
pHead = pHead-next;
}
printf("\n");
}
}
/* 4.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表 */
void clearList(Node *pHead)
{
Node *pNext; //定义一个与pHead相邻节点
if(pHead == NULL)
{
printf("clearList函数执行,链表为空\n");
return;
}
while(pHead-next != NULL)
{
pNext = pHead-next;//保存下一结点的指针
free(pHead);
pHead = pNext; //表头下移
}
printf("clearList函数执行,链表已经清除\n");
}
/* 5.返回单链表的长度 */
int sizeList(Node *pHead)
{
int size = 0;
while(pHead != NULL)
{
size++; //遍历链表size大小比链表的实际长度小1
pHead = pHead-next;
}
printf("sizeList函数执行,链表长度 %d \n",size);
return size; //链表的实际长度
}
/* 6.检查单链表是否为空,若为空则返回1,否则返回0 */
int isEmptyList(Node *pHead)
{
if(pHead == NULL)
{
printf("isEmptyList函数执行,链表为空\n");
return 1;
}
printf("isEmptyList函数执行,链表非空\n");
return 0;
}
/* 7.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行 */
elemType getElement(Node *pHead, int pos)
{
int i=0;
if(pos 1)
{
printf("getElement函数执行,pos值非法\n");
return 0;
}
if(pHead == NULL)
{
printf("getElement函数执行,链表为空\n");
return 0;
//exit(1);
}
while(pHead !=NULL)
{
++i;
if(i == pos)
{
break;
}
pHead = pHead-next; //移到下一结点
}
if(i pos) //链表长度不足则退出
{
printf("getElement函数执行,pos值超出链表长度\n");
return 0;
}
return pHead-element;
}
/* 8.从单链表中查找具有给定值x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL */
elemType *getElemAddr(Node *pHead, elemType x)
{
if(NULL == pHead)
{
printf("getElemAddr函数执行,链表为空\n");
return NULL;
}
if(x 0)
{
printf("getElemAddr函数执行,给定值X不合法\n");
return NULL;
}
while((pHead-element != x) (NULL != pHead-next)) //判断是否到链表末尾,以及是否存在所要找的元素
{
pHead = pHead-next;
}
if((pHead-element != x) (pHead != NULL))
{
printf("getElemAddr函数执行,在链表中未找到x值\n");
return NULL;
}
if(pHead-element == x)
{
printf("getElemAddr函数执行,元素 %d 的地址为 0x%x\n",x,(pHead-element));
}
return (pHead-element);//返回元素的地址
}
/* 9.把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0 */
int modifyElem(Node *pNode,int pos,elemType x)
{
Node *pHead;
pHead = pNode;
int i = 0;
if(NULL == pHead)
{
printf("modifyElem函数执行,链表为空\n");
}
if(pos 1)
{
printf("modifyElem函数执行,pos值非法\n");
return 0;
}
while(pHead !=NULL)
{
++i;
if(i == pos)
{
break;
}
pHead = pHead-next; //移到下一结点
}
if(i pos) //链表长度不足则退出
{
printf("modifyElem函数执行,pos值超出链表长度\n");
return 0;
}
pNode = pHead;
pNode-element = x;
printf("modifyElem函数执行\n");
return 1;
}
/* 10.向单链表的表头插入一个元素 */
int insertHeadList(Node **pNode,elemType insertElem)
{
Node *pInsert;
pInsert = (Node *)malloc(sizeof(Node));
memset(pInsert,0,sizeof(Node));
pInsert-element = insertElem;
pInsert-next = *pNode;
*pNode = pInsert;
printf("insertHeadList函数执行,向表头插入元素成功\n");
return 1;
}
/* 11.向单链表的末尾添加一个元素 */
int insertLastList(Node **pNode,elemType insertElem)
{
Node *pInsert;
Node *pHead;
Node *pTmp; //定义一个临时链表用来存放第一个节点
pHead = *pNode;
pTmp = pHead;
pInsert = (Node *)malloc(sizeof(Node)); //申请一个新节点
memset(pInsert,0,sizeof(Node));
pInsert-element = insertElem;
while(pHead-next != NULL)
{
pHead = pHead-next;
}
pHead-next = pInsert; //将链表末尾节点的下一结点指向新添加的节点
*pNode = pTmp;
printf("insertLastList函数执行,向表尾插入元素成功\n");
return 1;
}
/* 12.向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0 */
/* 13.向有序单链表中插入元素x结点,使得插入后仍然有序 */
/* 14.从单链表中删除表头结点,并把该结点的值返回,若删除失败则停止程序运行 */
/* 15.从单链表中删除表尾结点并返回它的值,若删除失败则停止程序运行 */
/* 16.从单链表中删除第pos个结点并返回它的值,若删除失败则停止程序运行 */
/* 17.从单链表中删除值为x的第一个结点,若删除成功则返回1,否则返回0 */
/* 18.交换2个元素的位置 */
/* 19.将线性表进行快速排序 */
/******************************************************************/
int main()
{
Node *pList=NULL;
int length = 0;
elemType posElem;
initList(pList); //链表初始化
printList(pList); //遍历链表,打印链表
pList=creatList(pList); //创建链表
printList(pList);
sizeList(pList); //链表的长度
printList(pList);
isEmptyList(pList); //判断链表是否为空链表
posElem = getElement(pList,3); //获取第三个元素,如果元素不足3个,则返回0
printf("getElement函数执行,位置 3 中的元素为 %d\n",posElem);
printList(pList);
getElemAddr(pList,5); //获得元素5的地址
modifyElem(pList,4,1); //将链表中位置4上的元素修改为1
printList(pList);
insertHeadList(pList,5); //表头插入元素12
printList(pList);
insertLastList(pList,10); //表尾插入元素10
printList(pList);
clearList(pList); //清空链表
system("pause");
}
使用结构体:
typedef struct node{
int data;
struct node* next;
}Node;
就可以实现,以上是一个单链表的节点元素,每个节点的next指向下一个节点,就可以实现链式存储了。遇到其他类似的问题,可以根据需要设置相应的指针域。
运行结果如下:
完整代码如下:
#includestdio.h
#includestdlib.h
typedef struct LNode
{
char data;
LNode *next;
}* LNodePtr;
LNodePtr CreateList()
{
//初始化头节点
LNodePtr head = (LNodePtr)malloc(sizeof(LNode));
head-data = 0;
head-next = NULL;
LNodePtr tNode;//临时节点
char data;
while(true)
{
scanf("%c",data);
if(data == '\0' || data == '\n' || data == '\r' || data == '\t')
{
continue;
}
if(data == '!')//输入感叹号停止插入节点
{
printf("输入链表元素结束。\n");
break;
}
if(data = 'A' data = 'Z')
{
tNode = (LNodePtr)malloc(sizeof(LNode));
tNode-data = data; /* 数据域赋值 */
tNode-next = head-next;
head-next = tNode;
}
else
{
printf("输入字符需为大写字母。\n");
}
}
return head;
}
/**
加密函数,加密的方式为链接head的所有节点前移offset位,但是不支持offset比链表的节点数多
@param head 链表头节点
@param offset 节点前移的位数
*/
void EncryptList(LNodePtr head,int offset)
{
LNodePtr tNode = head-next;
int i;
for(i = 0; i offset; i++)
{
if(tNode-next != NULL)
{
tNode = tNode-next;
}
}
if(i == offset)
{
LNodePtr newHead = tNode;
LNodePtr tail = tNode;
while (tail-next != NULL)
{
tail = tail-next;
}
tail-next = head-next;
while(tNode-next != NULL)
{
if(tNode-next != newHead)
{
tNode = tNode-next;
}
else
{
tNode-next = NULL;
break;
}
}
head-next = newHead;
}
else
{
printf("不支持移动");
}
}
void ListPrint(LNodePtr head)
{
if(head-next != NULL)
{
LNodePtr tNode = head-next;
while (tNode-next != NULL)
{
printf("%c ",tNode-data);
tNode = tNode-next;
}
printf("%c",tNode-data);
}
}
int main()
{
LNodePtr list = CreateList();
printf("\n创建的链表如下:\n");
ListPrint(list);
EncryptList(list,3);
printf("\n所有节点前移了3位之后的链表如下:\n");
ListPrint(list);
printf("\n");
return 0;
}
如果看不懂代码可以问我