1 思路: 主要是鏈表的插入和刪除操作
創(chuàng)新互聯(lián)是專業(yè)的鶴崗網(wǎng)站建設(shè)公司,鶴崗接單;提供網(wǎng)站制作、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行鶴崗網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
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)?調(diào)用進(jìn)棧函數(shù),將從鍵盤輸入的數(shù)據(jù)元素逐個(gè)進(jìn)棧,輸入0結(jié)束;");
int?num;
scanf("%d",?num);
while?(num?!=?0){
push(stack,?num);
scanf("%d",?num);
}
puts("\n(3)?顯示進(jìn)棧后的數(shù)據(jù)元素");
display(stack);
puts("\n(4)?調(diào)用兩次出棧函數(shù),顯示出棧后的數(shù)據(jù)元素");
if?(!IsEmpty(stack))
printf("%d\n",?pop(stack));
if?(!IsEmpty(stack))
printf("%d\n",?pop(stack));
destroy(stack);
getchar();
getchar();
return?0;
}
3 運(yùn)行效果
if中可以賦值給head的理由很簡單。
因?yàn)?if(PTScount(head) == 0)
if判斷的就是看它是不是 第一個(gè)元素。
如果是第一個(gè)元素,自然直接將ins賦值給head。
head所代表的就是第一個(gè)元素。
如果到了else這里,那么很明顯就不是第一個(gè)元素了。
那這個(gè)時(shí)候肯定就不可以直接復(fù)制給head了呀,因?yàn)閔ead可是代表第一個(gè)元素呀。
所以,你這是肯定改不了的。
樓主你好
代碼具體如下:
#includestdio.h
#includestdlib.h
typedef struct node
{
char ch;
struct node *next;
}LinkList;
void CreatList(LinkList * h)
{
LinkList *p;
LinkList *r=h;//尾結(jié)點(diǎn) 開始指向頭結(jié)點(diǎn)
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("轉(zhuǎn)換前:\n");
ListPrint(head);
ListTransfer(head);
printf("轉(zhuǎn)換后:\n");
ListPrint(head);
return 0;
}
希望能幫助你哈
比你要求的要多很多
看注釋
#include?"stdio.h"
#include?stdlib.h
#include?"string.h"
typedef?int?elemType?;
/************************************************************************/
/*?????????????以下是關(guān)于線性表鏈接存儲(chǔ)(單鏈表)操作的18種算法????????*/
/*?1.初始化線性表,即置單鏈表的表頭指針為空?*/
/*?2.創(chuàng)建線性表,此函數(shù)輸入負(fù)數(shù)終止讀取數(shù)據(jù)*/
/*?3.打印鏈表,鏈表的遍歷*/
/*?4.清除線性表L中的所有元素,即釋放單鏈表L中所有的結(jié)點(diǎn),使之成為一個(gè)空表?*/
/*?5.返回單鏈表的長度?*/
/*?6.檢查單鏈表是否為空,若為空則返回1,否則返回0?*/
/*?7.返回單鏈表中第pos個(gè)結(jié)點(diǎn)中的元素,若pos超出范圍,則停止程序運(yùn)行?*/
/*?8.從單鏈表中查找具有給定值x的第一個(gè)元素,若查找成功則返回該結(jié)點(diǎn)data域的存儲(chǔ)地址,否則返回NULL?*/
/*?9.把單鏈表中第pos個(gè)結(jié)點(diǎn)的值修改為x的值,若修改成功返回1,否則返回0?*/
/*?10.向單鏈表的表頭插入一個(gè)元素?*/
/*?11.向單鏈表的末尾添加一個(gè)元素?*/
/*?12.向單鏈表中第pos個(gè)結(jié)點(diǎn)位置插入元素為x的結(jié)點(diǎn),若插入成功返回1,否則返回0?*/
/*?13.向有序單鏈表中插入元素x結(jié)點(diǎn),使得插入后仍然有序?*/
/*?14.從單鏈表中刪除表頭結(jié)點(diǎn),并把該結(jié)點(diǎn)的值返回,若刪除失敗則停止程序運(yùn)行?*/
/*?15.從單鏈表中刪除表尾結(jié)點(diǎn)并返回它的值,若刪除失敗則停止程序運(yùn)行?*/
/*?16.從單鏈表中刪除第pos個(gè)結(jié)點(diǎn)并返回它的值,若刪除失敗則停止程序運(yùn)行?*/
/*?17.從單鏈表中刪除值為x的第一個(gè)結(jié)點(diǎn),若刪除成功則返回1,否則返回0?*/
/*?18.交換2個(gè)元素的位置?*/
/*?19.將線性表進(jìn)行快速排序?*/
/************************************************************************/
typedef?struct?Node{????/*?定義單鏈表結(jié)點(diǎn)類型?*/
elemType?element;
struct?Node?*next;
}Node;
/*?1.初始化線性表,即置單鏈表的表頭指針為空?*/
void?initList(Node?**pNode)
{
*pNode?=?NULL;
printf("initList函數(shù)執(zhí)行,初始化成功\n");
}
/*?2.創(chuàng)建線性表,此函數(shù)輸入負(fù)數(shù)終止讀取數(shù)據(jù)*/
Node?*creatList(Node?*pHead)
{
Node?*p1;
Node?*p2;
p1=p2=(Node?*)malloc(sizeof(Node));?//申請(qǐng)新節(jié)點(diǎn)
if(p1?==?NULL?||?p2?==NULL)
{
printf("內(nèi)存分配失敗\n");
exit(0);
}
memset(p1,0,sizeof(Node));
scanf("%d",p1-element);????//輸入新節(jié)點(diǎn)
p1-next?=?NULL;?????????//新節(jié)點(diǎn)的指針置為空
while(p1-element??0)????????//輸入的值大于0則繼續(xù),直到輸入的值為負(fù)
{
if(pHead?==?NULL)???????//空表,接入表頭
{
pHead?=?p1;
}
else???????????????
{
p2-next?=?p1;???????//非空表,接入表尾
}
p2?=?p1;
p1=(Node?*)malloc(sizeof(Node));????//再重申請(qǐng)一個(gè)節(jié)點(diǎn)
if(p1?==?NULL?||?p2?==NULL)
{
printf("內(nèi)存分配失敗\n");
exit(0);
}
memset(p1,0,sizeof(Node));
scanf("%d",p1-element);
p1-next?=?NULL;
}
printf("creatList函數(shù)執(zhí)行,鏈表創(chuàng)建成功\n");
return?pHead;???????????//返回鏈表的頭指針
}
/*?3.打印鏈表,鏈表的遍歷*/
void?printList(Node?*pHead)
{
if(NULL?==?pHead)???//鏈表為空
{
printf("PrintList函數(shù)執(zhí)行,鏈表為空\n");
}
else
{
while(NULL?!=?pHead)
{
printf("%d?",pHead-element);
pHead?=?pHead-next;
}
printf("\n");
}
}
/*?4.清除線性表L中的所有元素,即釋放單鏈表L中所有的結(jié)點(diǎn),使之成為一個(gè)空表?*/
void?clearList(Node?*pHead)
{
Node?*pNext;????????????//定義一個(gè)與pHead相鄰節(jié)點(diǎn)
if(pHead?==?NULL)
{
printf("clearList函數(shù)執(zhí)行,鏈表為空\n");
return;
}
while(pHead-next?!=?NULL)
{
pNext?=?pHead-next;//保存下一結(jié)點(diǎn)的指針
free(pHead);
pHead?=?pNext;??????//表頭下移
}
printf("clearList函數(shù)執(zhí)行,鏈表已經(jīng)清除\n");
}
/*?5.返回單鏈表的長度?*/
int?sizeList(Node?*pHead)
{
int?size?=?0;
while(pHead?!=?NULL)
{
size++;?????????//遍歷鏈表size大小比鏈表的實(shí)際長度小1
pHead?=?pHead-next;
}
printf("sizeList函數(shù)執(zhí)行,鏈表長度?%d?\n",size);
return?size;????//鏈表的實(shí)際長度
}
/*?6.檢查單鏈表是否為空,若為空則返回1,否則返回0?*/
int?isEmptyList(Node?*pHead)
{
if(pHead?==?NULL)
{
printf("isEmptyList函數(shù)執(zhí)行,鏈表為空\n");
return?1;
}
printf("isEmptyList函數(shù)執(zhí)行,鏈表非空\n");
return?0;
}
/*?7.返回單鏈表中第pos個(gè)結(jié)點(diǎn)中的元素,若pos超出范圍,則停止程序運(yùn)行?*/
elemType?getElement(Node?*pHead,?int?pos)
{
int?i=0;
if(pos??1)
{
printf("getElement函數(shù)執(zhí)行,pos值非法\n");
return?0;
}
if(pHead?==?NULL)
{
printf("getElement函數(shù)執(zhí)行,鏈表為空\n");
return?0;
//exit(1);
}
while(pHead?!=NULL)
{
++i;
if(i?==?pos)
{
break;
}
pHead?=?pHead-next;?//移到下一結(jié)點(diǎn)
}
if(i??pos)??????????????????//鏈表長度不足則退出
{
printf("getElement函數(shù)執(zhí)行,pos值超出鏈表長度\n");
return?0;
}
return?pHead-element;
}
/*?8.從單鏈表中查找具有給定值x的第一個(gè)元素,若查找成功則返回該結(jié)點(diǎn)data域的存儲(chǔ)地址,否則返回NULL?*/
elemType?*getElemAddr(Node?*pHead,?elemType?x)
{
if(NULL?==?pHead)
{
printf("getElemAddr函數(shù)執(zhí)行,鏈表為空\n");
return?NULL;
}
if(x??0)
{
printf("getElemAddr函數(shù)執(zhí)行,給定值X不合法\n");
return?NULL;
}
while((pHead-element?!=?x)??(NULL?!=?pHead-next))?//判斷是否到鏈表末尾,以及是否存在所要找的元素
{
pHead?=?pHead-next;
}
if((pHead-element?!=?x)??(pHead?!=?NULL))
{
printf("getElemAddr函數(shù)執(zhí)行,在鏈表中未找到x值\n");
return?NULL;
}
if(pHead-element?==?x)
{
printf("getElemAddr函數(shù)執(zhí)行,元素?%d?的地址為?0x%x\n",x,(pHead-element));
}
return?(pHead-element);//返回元素的地址
}
/*?9.把單鏈表中第pos個(gè)結(jié)點(diǎn)的值修改為x的值,若修改成功返回1,否則返回0?*/
int?modifyElem(Node?*pNode,int?pos,elemType?x)
{
Node?*pHead;
pHead?=?pNode;
int?i?=?0;
if(NULL?==?pHead)
{
printf("modifyElem函數(shù)執(zhí)行,鏈表為空\n");
}
if(pos??1)
{
printf("modifyElem函數(shù)執(zhí)行,pos值非法\n");
return?0;
}
while(pHead?!=NULL)
{
++i;
if(i?==?pos)
{
break;
}
pHead?=?pHead-next;?//移到下一結(jié)點(diǎn)
}
if(i??pos)??????????????????//鏈表長度不足則退出
{
printf("modifyElem函數(shù)執(zhí)行,pos值超出鏈表長度\n");
return?0;
}
pNode?=?pHead;
pNode-element?=?x;
printf("modifyElem函數(shù)執(zhí)行\(zhòng)n");
return?1;
}
/*?10.向單鏈表的表頭插入一個(gè)元素?*/
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函數(shù)執(zhí)行,向表頭插入元素成功\n");
return?1;
}
/*?11.向單鏈表的末尾添加一個(gè)元素?*/
int?insertLastList(Node?**pNode,elemType?insertElem)
{
Node?*pInsert;
Node?*pHead;
Node?*pTmp;?//定義一個(gè)臨時(shí)鏈表用來存放第一個(gè)節(jié)點(diǎn)
pHead?=?*pNode;
pTmp?=?pHead;
pInsert?=?(Node?*)malloc(sizeof(Node));?//申請(qǐng)一個(gè)新節(jié)點(diǎn)
memset(pInsert,0,sizeof(Node));
pInsert-element?=?insertElem;
while(pHead-next?!=?NULL)
{
pHead?=?pHead-next;
}
pHead-next?=?pInsert;???//將鏈表末尾節(jié)點(diǎn)的下一結(jié)點(diǎn)指向新添加的節(jié)點(diǎn)
*pNode?=?pTmp;
printf("insertLastList函數(shù)執(zhí)行,向表尾插入元素成功\n");
return?1;
}
/*?12.向單鏈表中第pos個(gè)結(jié)點(diǎn)位置插入元素為x的結(jié)點(diǎn),若插入成功返回1,否則返回0?*/
/*?13.向有序單鏈表中插入元素x結(jié)點(diǎn),使得插入后仍然有序?*/
/*?14.從單鏈表中刪除表頭結(jié)點(diǎn),并把該結(jié)點(diǎn)的值返回,若刪除失敗則停止程序運(yùn)行?*/
/*?15.從單鏈表中刪除表尾結(jié)點(diǎn)并返回它的值,若刪除失敗則停止程序運(yùn)行?*/
/*?16.從單鏈表中刪除第pos個(gè)結(jié)點(diǎn)并返回它的值,若刪除失敗則停止程序運(yùn)行?*/
/*?17.從單鏈表中刪除值為x的第一個(gè)結(jié)點(diǎn),若刪除成功則返回1,否則返回0?*/
/*?18.交換2個(gè)元素的位置?*/
/*?19.將線性表進(jìn)行快速排序?*/
/******************************************************************/
int?main()
{
Node?*pList=NULL;
int?length?=?0;
elemType?posElem;
initList(pList);???????//鏈表初始化
printList(pList);???????//遍歷鏈表,打印鏈表
pList=creatList(pList);?//創(chuàng)建鏈表
printList(pList);
sizeList(pList);????????//鏈表的長度
printList(pList);
isEmptyList(pList);?????//判斷鏈表是否為空鏈表
posElem?=?getElement(pList,3);??//獲取第三個(gè)元素,如果元素不足3個(gè),則返回0
printf("getElement函數(shù)執(zhí)行,位置?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");
}
使用結(jié)構(gòu)體:
typedef struct node{
int data;
struct node* next;
}Node;
就可以實(shí)現(xiàn),以上是一個(gè)單鏈表的節(jié)點(diǎn)元素,每個(gè)節(jié)點(diǎn)的next指向下一個(gè)節(jié)點(diǎn),就可以實(shí)現(xiàn)鏈?zhǔn)酱鎯?chǔ)了。遇到其他類似的問題,可以根據(jù)需要設(shè)置相應(yīng)的指針域。
運(yùn)行結(jié)果如下:
完整代碼如下:
#includestdio.h
#includestdlib.h
typedef struct LNode
{
char data;
LNode *next;
}* LNodePtr;
LNodePtr CreateList()
{
//初始化頭節(jié)點(diǎn)
LNodePtr head = (LNodePtr)malloc(sizeof(LNode));
head-data = 0;
head-next = NULL;
LNodePtr tNode;//臨時(shí)節(jié)點(diǎn)
char data;
while(true)
{
scanf("%c",data);
if(data == '\0' || data == '\n' || data == '\r' || data == '\t')
{
continue;
}
if(data == '!')//輸入感嘆號(hào)停止插入節(jié)點(diǎn)
{
printf("輸入鏈表元素結(jié)束。\n");
break;
}
if(data = 'A' data = 'Z')
{
tNode = (LNodePtr)malloc(sizeof(LNode));
tNode-data = data; ? ? /* ?數(shù)據(jù)域賦值 ?*/
tNode-next = head-next;
head-next = tNode;
}
else
{
printf("輸入字符需為大寫字母。\n");
}
}
return head;
}
/**
加密函數(shù),加密的方式為鏈接head的所有節(jié)點(diǎn)前移offset位,但是不支持offset比鏈表的節(jié)點(diǎn)數(shù)多
@param head 鏈表頭節(jié)點(diǎn)
@param offset 節(jié)點(diǎn)前移的位數(shù)
*/
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("不支持移動(dòng)");
}
}
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創(chuàng)建的鏈表如下:\n");
ListPrint(list);
EncryptList(list,3);
printf("\n所有節(jié)點(diǎn)前移了3位之后的鏈表如下:\n");
ListPrint(list);
printf("\n");
return 0;
}
如果看不懂代碼可以問我